Django-静的ファイルが見つかりません


80

この問題に関するいくつかの投稿を見ましたが、解決策が見つかりませんでした。

Django1.3開発環境内で静的ファイルを提供しようとしています。

これが私の設定です

...
STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
  '/static/',
)
...

私のurls.py

urlpatterns = patterns('',
...
  url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root', settings.STATIC_ROOT}
  ),
...
);

私の/ home / glide / Documents / django / cbox / static /ディレクトリは次のようなものです

css
  main.css
javascript
image

http://127.0.0.1:8000/static/css/main.cssにアクセスしようとすると404エラーが発生します

css、javascript、画像のパターンを個別に指定する必要がありますか?

回答:


110

STATIC_ROOTSTATICFILES_DIRSを混同しました

実際、私はSTATIC_ROOTの有用性を本当に理解していませんでした。共通ファイルを置かなければならないディレクトリだと思いました。このディレクトリは、生産に使用され、これは静的ファイルがで(収集)入れられますれているディレクトリですcollectstatic

STATICFILES_DIRSは私が必要とするものです。

私は開発環境にいるので、解決策はSTATIC_ROOTを使用せ(または別のパスを指定して)、共通ファイルディレクトリをSTATICFILES_DIRSに設定することです。

#STATIC_ROOT = (os.path.join(SITE_ROOT, 'static_files/'))
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
STATICFILES_DIRS = (
  os.path.join(SITE_ROOT, 'static/'),
)

また、忘れないでください from django.conf import settings


2
urls.pyは質問のようにすべきではありません(メディアでも同じです)。from django.conf import settingsもちろん、忘れないでください
Pierre de LESPINAY 2011

私はこの答えに追加したいだけです、sをお見逃しなく。STATICFILES_DIRSである必要があります。私はSTATICFILE_DIRSを実行し、エラーを探して45分間夢中になりました。
niccolom。

1
BASE_DIR代わりに組み込みのconstを使用するSITE_ROOTと、機能します。
MadukaJayalath19年

33

settings.py問題を引き起こす原因は2つだけです。

1) STATIC_URL = '/static/'

2)

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

静的ファイルは、プロジェクトの設定ファイルと同じディレクトリにある静的ディレクトリの下にある必要があります。

それでも、静的ファイルがロードされていない場合は、理由は、保持している可能性があります

DEBUG = False

Trueに変更します(厳密には開発のみ)。本番STATICFILES_DIRS環境では、静的ファイルが存在するパスに変更するだけです。


2
私の場合、デバッグ用の環境変数がfalseでした。私はそれをtrueに設定し、現在は機能しています
SmitPatel19年

こんにちは..私は言及されたすべての解決策を試しましたが、それでも404が表示されます。誰かがそれを手伝ってもらえますか?
Mukul_Vashistha

32

静的ファイルの提供は、いくつかの方法で実現できます。これが私の自己メモです:

  • static/my_app/ディレクトリを追加しmy_appます(以下の名前空間に関する注記を参照)
  • 新しいトップレベルディレクトリを定義し、それをsettings.pyのSTATICFILES_DIRSに追加します(注意してくださいThe STATICFILES_DIRS setting should not contain the STATIC_ROOT setting

私は最初の方法と、ドキュメント定義されている方法に近い設定を好みます。そのため、ファイルadmin-custom.cssを提供していくつかの管理スタイルをオーバーライドするために、次のような設定を行います。

.
├── my_app/
│   ├── static/
│   │   └── my_app/
│   │       └── admin-custom.css
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── static/
├── templates/
│   └── admin/
│       └── base.html
└── manage.py
# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

これは、次のようにテンプレートで使用されます。

# /templates/admin/base.html
{% extends "admin/base.html" %}
{% load static %}

{% block extrahead %}
    <link rel="stylesheet" href="{% static "my_app/admin-custom.css" %}">
{% endblock %}

開発中にdjango.contrib.staticfiles [ed:デフォルトでインストール]を使用する場合、DEBUGがTrueに設定されているとrunserverによって自動的に実行されます[...]

https://docs.djangoproject.com/en/1.10/howto/static-files/

デプロイするときcollectstatic、nginxで静的ファイルを実行して提供します。


私にとってすべての混乱を解消したドキュメント:

STATIC_ROOT

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

...静的ファイルを永続的に保存する場所ではありません。これは、staticfilesのファインダーによって検出されるディレクトリ(デフォルトでは「static /」アプリサブディレクトリおよびSTATICFILES_DIRSに含めるディレクトリ)で行う必要があります。

https://docs.djangoproject.com/en/1.10/ref/settings/#static-root


静的ファイルの名前空間

これで、静的ファイルを(別のmy_appサブディレクトリを作成するのではなく)my_app / static /に直接配置することで回避できる可能性がありますが、実際には悪い考えです。Djangoは、名前が一致する最初の静的ファイルを使用します。別のアプリケーションに同じ名前の静的ファイルがある場合、Djangoはそれらを区別できません。Djangoを正しいものに向けることができる必要があります。これを確実にする最も簡単な方法は、名前を付けることです。つまり、これらの静的ファイルを、アプリケーション自体に名前が付けられた別のディレクトリ内に配置します。

https://docs.djangoproject.com/en/1.10/howto/static-files/


STATICFILES_DIRS

プロジェクトには、特定のアプリに関連付けられていない静的アセットも含まれている可能性があります。アプリ内でstatic /ディレクトリを使用することに加えて、Djangoが静的ファイルを検索する設定ファイルにディレクトリのリスト(STATICFILES_DIRS)を定義できます。

https://docs.djangoproject.com/en/1.10/howto/static-files/


8

静的URLが正しいが、それでも:

見つかりません:/static/css/main.css

おそらくあなたのWSGIの問題です。

➡ConfigWSGIは、開発環境と本番環境の両方に対応します

==========================project/project/wsgi.py==========================

import os
from django.conf import settings
from django.contrib.staticfiles.handlers import StaticFilesHandler
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
if settings.DEBUG:
    application = StaticFilesHandler(get_wsgi_application())
else:
    application = get_wsgi_application()

6
  1. あなたは削除することができます STATIC_ROOT
  2. またはstatic、別のディレクトリに別のフォルダを作成することもできます。ディレクトリが次のようになっているとしproject\static ます。今すぐ更新:
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'project/static/')
    ]
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

重要な点は何をするにしても、同じディレクトリを含めるべきではSTATICFILES_DIRSありSTATIC_ROOTません。

久しぶりですが、新しい仲間が助けてくれることを願っています


3

別のエラーは、次のINSTALLED_APPSようなリストにアプリがリストされていない可能性があります。

INSTALLED_APPS = [
    # ...
    'your_app',
]

それがないと、静的ファイル、基本的にはアプリに関連するすべてのファイルが検出されないなどの問題に直面する可能性があります。正解で提案されているように、次を使用して正しくすることができますが、

STATICFILES_DIRS = (adding/path/of/your/app)

エラーの1つである可能性があり、このエラーが発生した場合は確認する必要があります。


2

INSTALLED_APPSにプロジェクト名を追加することで、この問題を解決します。ここに画像の説明を入力してください


これで修正されましたが、私の場合、各アプリに独自の静的フォルダーが必要な、より良いソリューションが必要になる可能性があります
SeanDp 3220年

1

DEBUGローカル設定の設定を移動して、デフォルトFalse値で上書きすることがわかりました。基本的にあなたが開発しているかどうかわからDEBUGの設定が実際に偽であることを確認するために見えるDEBUGrunserver


1

cmd typeコマンド python manage.py findstatic --verbosity 2 static で、Djangoが静的ファイルを探しているディレクトリを指定します。仮想環境を作成した場合、このvirtual_environment_nameフォルダー内に静的フォルダーがあります。 VIRTUAL_ENVIRONMENT_NAME\Lib\site-packages\django\contrib\admin\static。上記の「findstatic」コマンドを実行すると、Djangoがこのパスを表示した場合は、すべての静的ファイルをこの静的ディレクトリに貼り付けます。HTMLファイルでhrefにJINJA構文を使用し、他のインラインcssを確認します。JINJA構文を指定した後も画像のsrcまたはurlが存在する場合は、その前に「/ static」を付けます。これは私のために働いた。


1
TEMPLATE_DIR=os.path.join(BASE_DIR,'templates')
STATIC_DIR=os.path.join(BASE_DIR,'static')

STATICFILES_DIRS=[STATIC_DIR]

1

settings.pyには次のようなものがあります。

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates'、

'DIRS':["templates"]、

'APP_DIRS':True、

'OPTIONS':{
#...ここにいくつかのオプション.. 。
}、
}、]

または

STATIC_URL = '/ static /'

または

STATICFILES_DIRS =(os.path.join(BASE_DIR、 "static")、)


0

django-storagesモジュールを追加し(たとえば、djangoアプリでS3へのファイルのアップロードをサポートするため)、私のようにこのモジュールのドキュメントを正しく読んでいない場合は、次の行を削除してくださいsettings.py

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

そうしないと、静的アセットがローカルマシンではなく、管理パネルCSSを含むS3バケット内でリモートに表示され、管理パネルCSSが効果的に破損します。


0

STATICFILES_DIRS で使用されている開発STATIC_ROOT生産

STATICFILES_DIRS そして STATIC_ROOT同じフォルダ名を持つべきではありません、

開発と本番環境でまったく同じ静的フォルダーを使用する必要がある場合は、この方法を試してください

これを含める settings.py

import socket

HOSTNAME = socket.gethostname()

# if hostname same as production url name use STATIC_ROOT 
if HOSTNAME == 'www.example.com':
    STATIC_ROOT = os.path.join(BASE_DIR, "static/")

else:
    STATICFILES_DIRS = [
            os.path.join(BASE_DIR, 'static/'),
        ]

-1

{'document_root', settings.STATIC_ROOT} する必要があります {'document_root': settings.STATIC_ROOT}

または、次のようなエラーが発生します dictionary update sequence element #0 has length 6; 2 is required

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