为什么django开发服务器找不到我的静态文件

时间:2017-01-17 19:12:37

标签: django

我真的很困惑。我有一个django网站设置,我的设置都是正确的,但当我运行我的服务器时,它找不到文件。请参阅下面的必要代码。

settings.py:

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.admin',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    'django_comments',
    'best_schools',
    'debug_toolbar',
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'debug_toolbar.middleware.DebugToolbarMiddleware',
]
# --snip--
STATIC_URL = '/static/'
STATIC_ROOT = os.path.dirname(os.path.dirname(
    os.path.abspath(__file__))) + '/static/'

目录结构:

jonathan at k-nine ~/Sites/tbs_django (master tbs_django) [02:04 pm]
 -> ls ./
best_schools/  db.sqlite3  license.txt  manage.py*  README.md  requirements.txt  static/  tbs/  templates/

ipython控制台:

In [1]: from tbs import settings

In [2]: settings.STATIC_ROOT
Out[2]: '/home/jonathan/Sites/tbs_django/static/'

In [3]: settings.STATIC_URL
Out[3]: '/static/'

manage.py findstatic的输出甚至看不到我的静态目录:

jonathan at k-nine ~/Sites/tbs_django (master tbs_django) [02:06 pm]
 -> manage.py findstatic --verbosity 2 custom-admin.css
/home/jonathan/Sites/tbs_django/manage.py
No matching file found for 'custom-admin.css'.

Looking in the following locations:
  /home/jonathan/.virtualenvs/django-tbs/lib/python3.6/site-packages/django/contrib/admin/static
  /home/jonathan/.virtualenvs/django-tbs/lib/python3.6/site-packages/debug_toolbar/static

我在urls.py中有这个:urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

奇怪的是,当我运行manage.py runserver --nostatic时,它完美无缺。为什么django找不到我的静态文件?我正在运行Django 1.10.2。

2 个答案:

答案 0 :(得分:0)

尝试在urls.py中添加这些行并使用collectstatic

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

python manage.py collectstatic

答案 1 :(得分:0)

通常的想法是静态文件属于某个应用,并且位于static/中该应用的目录中。这就是Django自己的应用程序如何运作,以及管理员工作的原因。

例如,best_schools应用程序的静态文件应该在

'/home/jonathan/Sites/tbs_django/best_schools/static/best_schools/'

(是的,那是best_schools两次)。您应该在urls.py中为runserver添加任何内容以查找它们。

然后当你去制作并且文件由除Django之外的某个Web服务器提供服务时,你运行python manage.py collectstatic,搜索所有INSTALLED_APPS并将文件复制到配置的STATIC_ROOT,你服务的是网络服务器。