Djangoの静的STATIC_URLとSTATIC_ROOTの違い


127

私は混乱しstatic root、物事を明確にしたいと思います。

Djangoで静的ファイルを提供するには、次のものがsettings.pyand に含まれている必要がありurls.pyます。

import os
PROJECT_DIR=os.path.dirname(__file__)

1.静的ファイルを収集するディレクトリへの絶対パス

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')

2.静的ファイルのURLプレフィックス

STATIC_URL = '/static/'

3.静的ファイルの追加の場所

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)

...そしてurls.py次の行で:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))

4.また、 python manage.py collectstatic

質問:

  1. 誰かがワークフローを私に説明してくれませんか?今のところ、上記のコードスニペットを指定された場所にコピーして貼り付け、静的ディレクトリに新しいファイルを作成し続けます。私にはsettings.STATIC_ROOT、しかし、私は別のディレクトリに指摘しています。

  2. 誰かが各設定のワークフローを説明できればすばらしいでしょう:ファイルがどのように収集および管理されるか、そして従うべき良い習慣は何でしょうか。

ありがとう。


「ワークフローを説明する」とはどういう意味ですか?また、パート3で開発している場合、URLパターンは条件付きである必要があります。これは、if settings.DEBUG:django を追加することで行うことができます。静的メディアの提供にはあまり適していません。実際のWebサーバーに任せてください。
dm03514

こんにちは@ user993563私はいくつかのフォーラムで解決策を見つけることができません。しかし、あなたの質問はそれを明確に説明します。ありがとう...素晴らしい仕事...
Mohideen bin Mohammed

良い説明、ありがとう
Ajay Kumar

回答:


89

STATIC_ROOT

./manage.py collectstaticが配置する静的ファイルを収集するディレクトリへの絶対パス。 例:STATIC_ROOT="/var/www/example.com/static/"

これで、コマンド./manage.py collectstaticはすべての静的ファイル(つまり、アプリの静的フォルダー、すべてのパスの静的ファイル)をディレクトリにコピーします/var/www/example.com/static/。これで、このディレクトリをapacheまたはnginx..etcで提供するだけで済みます。

STATIC_URL

URL静的ファイルをそのSTATIC_ROOTディレクトリには、(Apacheやnginx..etcで)提供しています。 例:/static/またはhttp://static.example.com/

を設定する場合は、urlでapacheまたはnginxを使用しSTATIC_URL = 'http://static.example.com/'STATIC_ROOTフォルダー(つまり"/var/www/example.com/static/")を提供する必要があります'http://static.example.com/'(そのため、で静的ファイル'/var/www/example.com/static/jquery.js'を参照できます'http://static.example.com/jquery.js'

django-templatesで、次のように参照できます。

{% load static %}
<script src="{% static "jquery.js" %}"></script>

レンダリングされます:

<script src="http://static.example.com/jquery.js"></script>

1
あなたの例とこれの違いは何ですか:href = "{%static" jquery.js "%}"
ユーザー

8
@macdonjo両方{{ STATIC_URL }}jquery.js{% static "jquery.js" %}同じです。つまり、両方とも戻り/static/jquery.jsます。新しいdjangoバージョンはを使用することをお勧めします{% static "jquery.js" %}が、テンプレートタグ、つまりをロードする必要があります{% load staticfiles %}。で、古いDjangoのバージョンをお勧めします{{STATIC_URL}}
suhailvs

そうですか。1つのページを除いて、ほとんどのテンプレートでスタイルシートをロードするバグを見つけようとしていました。staticメソッドではなくメソッドに変更しましたがSTATIC_URL、バグはなくなりました。バージョンに基づく提案についての良い電話。
ユーザー

37

STATICFILES_DIRS:プロジェクトの静的ファイル(テンプレートで使用されるファイルなど)をここに保持できます。

STATIC_ROOT:空のままにしますmanage.py collectstatic。そうすると、システム上のすべての静的ファイルが検索され、ここに移動されます。静的ファイルサーバーは、このフォルダーがどこにあっても、このフォルダーにマップされることになっています。collectstaticの実行後に確認すると、djangoが構築したディレクトリ構造が表示されます。

--------編集----------------

@DarkCygnusで指摘されているように、STATIC_ROOTはファイルシステム上のディレクトリを指している必要があります。Djangoが入力するため、フォルダーは空である必要があります。

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

または

STATIC_ROOT = '/opt/web/project/static_files'

--------編集の終了-----------------

STATIC_URL: '/ static /'は通常は問題ありませんが、静的ファイルのプレフィックスにすぎません。


2
ここでは、1.3で静的ファイル管理へのリンクdocs.djangoproject.com/en/1.3/howto/static-files
keni

2
STATICFILES_DIRS静的ファイルの追加ディレクトリとして機能する必要がありますSTATICFILES_DIRS。すべてのcss / js / imagesをAPP_NAME / static / APP_NAMEフォルダーに配置した場合は、を指定する必要はありません。
laike9m 2013

回答をありがとう、STATIC_ROOTを空のままにしておくことについて、collectstatic コマンドを実行する前に(を実行settings.pyしてSTATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles'))実際に指定する必要がありました。
DarkCygnus

うーん、これがどれほど簡単に誤解を招く可能性があるかがわかります。空のままにしておくと、通常は最初は空で、ファイルはありません。混乱を解消するために回答を更新します。
ケニ

2

上記のすべての回答は役に立ちますが、私の問題を解決するものはありません。私のプロダクションファイルでは、STATIC_URLはhttps://<URL>/static以前と同じで、dev settings.pyファイルで同じSTATIC_URLを使用しました。

これにより、django / conf / urls / static.pyでサイレントエラーが発生します。

このテストelif not settings.DEBUG or '://' in prefix: では、URL内の「//」を取得し、静的URLパターンを追加しないため、静的ファイルが見つかりません。

Djangoがhttp(s)://withを使用できないことを示すエラーメッセージを出力する場合は、注意が必要です。DEBUG = True

STATIC_URLを「/ static /」に変更する必要がありました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.