web-dev-qa-db-ja.com

Django '/' urlで静的index.htmlを表示する

Index.htmlは/ static /フォルダーにあります。私のDjango私が試してみると、アプリは正常に動作しています:

http://127.0.0.1:8000/index.html

しかし、私はURLでindex.htmlにアクセスしたい:

http://127.0.0.1:8000/

私はビューを書きましたが、それは動作します:

class IndexView(TemplateView):
    template_name = 'index.html'

また、urls.pyに追加しました(これにより、http://127.0.0.1:8000/css/style.css):

url(r'^(?P<path>.*)$', 'Django.contrib.staticfiles.views.serve', {
            'document_root': settings.STATIC_ROOT, 'show_indexes':True
        }),

しかし、私はTemplateViewなしで私がやりたいことをする方法があると思います。

助言がありますか?ありがとう。 My Djangoバージョンは:Django 1.5

[〜#〜] edit [〜#〜]

Index.htmlを静的に配置した理由:Phonegap互換性のあるDjango appにしたいので、適切なコーディングの後、私がしなければならないのは-> make .Zip from staticフォルダーをモバイルアプリとしてPhonegapにアップロードします。

40
Feanor

static/index.htmlこのような開発の場合:

if settings.DEBUG:
    urlpatterns += url(
        r'^$', 'Django.contrib.staticfiles.views.serve', kwargs={
            'path': 'index.html', 'document_root': settings.STATIC_ROOT}),

しかし、運用環境では、nginx(または他のフロントエンドサーバー)を設定してindex.htmlファイル/場所

[〜#〜] update [〜#〜]

このようにするべきケースを説明したいと思います。たとえば、あなたのDjangoアプリはadminおよびapiビューのみですが、クライアントは単一ページのアプリ(Ember、Angularなど)と対話します。したがって、プロジェクトには少なくとも2つのサブプロジェクトがあり、1つはメインDjango appで、2つ目はすべてのhtml/js/cssを備えたクライアントアプリです。クライアントスクリプトをDjangoバックエンド、フロントエンド開発者が自分の仕事をしてDjangoの存在を回避できるようにします(いつかは別個のリポジトリに移動できます)。

したがって、この場合、次のビルドワークフローを取得します。

  1. クライアントアプリソースウォッチャーを実行して、スクリプト/スタイル/テンプレートを再構築します(brunch watchgruntジョブまたはgulp監視タスク)
  2. Django=本番用に静的を収集します
  3. 開発用にurlpatternsを修正し、本番用に正しいnginx構成を持っていることを確認してください

これが私のurls.py

urlpatterns += patterns(
    'Django.contrib.staticfiles.views',
    url(r'^(?:index.html)?$', 'serve', kwargs={'path': 'index.html'}),
    url(r'^(?P<path>(?:js|css|img)/.*)$', 'serve'),
)
50
Anton Egorov

この場合、TemplateViewをサブクラス化する必要はありません。 TemplateViewをURL confで直接使用できますが、index.htmlはテンプレートディレクトリにあります。

from Django.views.generic.base import TemplateView

urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name='index.html'), name="home"),
]
40
Alasdair

テンプレートHTMLファイルで定義されたiframeで静的HTMLファイルをラップするだけです。スタイルによっては、iframeを100%の幅と高さに調整できます。

{% load static %}
<html>
    <head>
        <title>Templated HTML</title>

        <style>
            html, body {
                width: 100%;
                width: 100%;
                margin: 0;
                padding: 0;
                border-width: 0;
            }

            iframe {
                position: absolute;
                top: 0;
                left: 0;
                width: 100vw;
                height: 100vh;
                margin: 0;
                padding: 0;
                border-width: 0;
            }
        </style>
    </head>
    <body>
        {{ content }}
        <iframe src="{% static 'main/html/test.html' %}"></iframe>
    </body>
</html>
2
Geordie

テンプレートディレクトリを作成し、そこにhtmlを配置して、views.pyからレンダリングできます。

    def index(request):
        return render(request, 'my_app/index.html', context={})

settings.pyでtemplates_dirを設定することを忘れないでください

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES_DIR = os.path.join(BASE_DIR, "templates")

TEMPLATES = [
{
    'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
    'DIRS': [TEMPLATES_DIR,],
    'APP_DIRS': True,
    ...
1

提供方法についての長い説明をご覧くださいindex.html on / in this answer (またはa ブログ投稿 )。ただし、Django(フロントエンドルーティングが必要なため)によって提供される本格的なSPAを使用する場合は、このソリューションだけでは不十分な場合があります。

/static//にルーティングし、すべてのリクエストをフロントエンドに転送し、index.htmlファイルを見つけるためのさまざまな方法で遊んでいます。最終的に、これをすべて解決する最良の方法は、rls.pyを調整することではなく、 Django-spa (READMEのインストール手順)。

関連する議論のいくつかは、この WhiteNoiseの問題 にあります。

0
metakermit