web-dev-qa-db-ja.com

STATICFILES_DIR、STATIC_ROOT、およびMEDIA_ROOTの違い

これら3つの静的URLの違いは何ですか?

自分が正しいかどうかわかりません。アップロードした写真を保存するために_MEDIA_ROOT_を使用しています(models.ImageField()経由)

ただし、管理者と_admin.py_にJSスクリプトを作成しました。以下のようにメディアを定義しました:

_....
class Media:
      js = ('/admin/custom.js', )
_

および私の_settings.py_:

_ ....
 STATIC_ROOT = "/home/user/project/Django1/top/listing/static"
_

_custom.js_を_STATIC_ROOT/admin/custom.js_に追加しましたが、機能していません。 404 not foundエラーをスローします。

そして、_STATIC_ROOT_を_STATICFILES_DIRS_に変更すると、動作します!!

_....
STATICFILES_DIRS = "/home/user/project/Django1/top/listing/static"
_

だから、私はここで何が起こっているのか理解していない。実際、私は_STATIC_ROOT_と_STATICFILES_DIRS_の違いを理解していません。

現在、私は仮想マシンを使用してDjangoをテストしていますが、まだデプロイされていません。それは_STATIC_ROOT_が機能しない理由ですか??

50
dev-jim

これらの設定は Django documentation にあります。ドキュメントからの私自身の定義と引用は次のとおりです。

  • MEDIA_ROOTは、FileFieldを使用してアップロードされたファイルが保存されるフォルダーです。

    ser-uploaded files を保持するディレクトリへの絶対ファイルシステムパス。

  • STATIC_ROOTは、manage.py collectstaticを使用した後に静的ファイルが保存されるフォルダーです

    collectstaticが展開用の静的ファイルを収集するディレクトリへの絶対パス。

    staticfiles contribアプリが有効になっている場合(デフォルト)、collectstatic管理コマンドは静的ファイルをこのディレクトリに収集します。使用法の詳細については、静的ファイルの管理に関するハウツーを参照してください。

  • STATICFILES_DIRSは、Django=がインストールされた各アプリのstaticフォルダー以外の追加の静的ファイルを検索するフォルダーのリストです。

    この設定は、FileSystemFinder Finderが有効になっている場合にstaticfilesアプリが通過する追加の場所を定義します。 collectstaticまたはfindstatic管理コマンドを使用する場合、または静的ファイル提供ビューを使用する場合。

設定には、次のものが必要です。

MEDIA_ROOT = os.path.join(BASE_DIR, "media/")
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

# Make a Tuple of strings instead of a string
STATICFILES_DIRS = ("/home/user/project/Django1/top/listing/static", )

...ここで:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

デフォルトで定義されているDjango settings.py now。

77
Maxime Lorant

開発

STATIC_ROOTは開発中は役に立たないため、デプロイメントにのみ必要です。

開発中、STATIC_ROOTは何もしません。あなたもそれを設定する必要はありません。 Django=各アプリのディレクトリ(myProject/appName/static)内の静的ファイルを探し、それらを自動的に提供します。

これは、manage.py runserverのときにDEBUG=Trueが行う魔法です。

展開

プロジェクトが開始されると、状況は異なります。ほとんどの場合、Djangoを使用して動的コンテンツを提供し、静的ファイルはNginxによって提供されます。なぜですか?Nginxは非常に効率的であり、Djangoのワークロードを削減するからです。

NginxはDjangoプロジェクトについては何も知らず、静的ファイルの場所を知らないため、STATIC_ROOTは便利です。

したがって、STATIC_ROOT = '/some/folder/'を設定し、/some/folder/で静的ファイルを探すようにNginxに指示します。次にmanage.py collectstaticを実行し、Django=は、必要なすべてのアプリから静的ファイルを/some/folder/にコピーします。

静的ファイル用の追加ディレクトリ

STATICFILES_DIRSは、検索するcollectstaticの-​​追加ディレクトリを含めるために使用されます。たとえば、デフォルトでは、Djangoは/myProject/static/を認識しません。したがって、自分で含めることができます。

STATIC_URL = '/static/'

if not DEBUG: 
    STATIC_ROOT = '/home/Django/www-data/site.com/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static/'),
]
72
Max Malysh

STATICFILES_DIRSSTATIC_ROOTの違い

STATICFILES_DIRSには静的ファイルを含む他のディレクトリ(必ずしもアプリディレクトリではない)を含めることができ、これらの静的ファイルはcollectstaticの実行時にSTATIC_ROOTに収集されます。これらの静的ファイルはWebサーバーによって提供され、STATIC_ROOTから提供されます。

STATIC_ROOTに現在提供したいファイルがある場合、それらを別のディレクトリに移動し、その別のディレクトリをSTATICFILES_DIRSに配置する必要があります。 STATIC_ROOTディレクトリは空にして、すべての静的ファイルをそのディレクトリに収集する必要があります。

MEDIA_ROOTメディアファイル、アップロードされたすべてのファイルの場所。例:画像、ファイル

19
Prashant Gaur