首页 > 解决方案 > django:找不到运行服务器静态文件

问题描述

我读过一些关于类似主题的帖子,但没有一个是完全相同的。

我有一个 django 应用程序(django 2.2.2,python 3.6.12)在使用 uwsgi(连同 nginx)服务时没有问题,但是在使用 runserver 服务时查找静态文件有问题(python manage.py runserver 0 :8000) 错误消息如下:

WARNING Not Found: /static/admin/css/base.css
WARNING Not Found: /static/stylesheets/css/style.css
WARNING Not Found: /static/admin/js/core.js

这些警告是由访问网页中的行引起的,如下所示。

<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css">
<script type="text/javascript" src="/static/admin/js/core.js"></script>

当然,由于无法访问静态文件,网页无法正确显示。

我有以下设置:

BASE_PATH = '/data/webapps/myapp'
STATIC_ROOT = os.path.join(BASE_PATH, '_site/static')

在 BASE_PATH 中,我有如下文件夹,其中包含系统抱怨找不到的所有文件:

_site/static/admin/css
_site/static/admin/js
_site/static/stylesheets/css

我什至直接在 BASE_PATH 下复制了 _site 下的所有文件夹,如下所示,但没有任何效果。

static/admin/css
static/admin/js
static/stylesheets/css

在这里我想强调的是,当使用以下命令与 uwsgi 一起使用时,它可以正常工作:

uwsgi --ini uwsgi.ini

并且 uwsgi.ini 包含以下几行:

[uwsgi]
chdir          = %d
enable-threads = true
max-requests   = 5000
file           = /data/webapps/myapp/myapp/conf/wsgi.py
socket         = uwsgi.sock
chmod          = 666
chmod-socket   = 666
uid            = myapp
gid            = myapp

和 wsgi.py 有以下代码:

import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mybic.conf.settings')
application = get_wsgi_application()

任何帮助表示赞赏。

附言

findstatic 命令也找不到这些文件。例如,以下命令找不到匹配项。

python manage.py findstatic --verbosity=2 core.js

为静态文件添加一个包含所有文件夹路径的向量 STATICFILES_DIRS ,如下所示,只会帮助 findstatic 命令而不是 runserver 命令,也就是说,仍然存在访问网页的警告。

STATICFILES_DIRS = [
    os.path.join(BASE_PATH, '_site/static/stylesheets/css'),
    os.path.join(BASE_PATH, '_site/static/stylesheets/js'),
    os.path.join(BASE_PATH, '_site/static/admin/css'),
    os.path.join(BASE_PATH, '_site/static/admin/js'),
    ...
]

标签: pythondjangopython-3.6django-staticfiles

解决方案


改变DEBUG = TRUE。如果它只是按照这篇文章解决问题的工作。

保留DEBUG = False,因为许多安全原因。

安装pip install whitenoise(当前版本为 5.2.0)

在你的settings.py

  1. 添加'whitenoise.middleware.WhiteNoiseMiddleware',MIDDLEWARE
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware', # Add WhiteNoise here
    ...
]
  1. 在下面添加STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'您的STATIC_ROOT
if DEBUG:
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static')
    ]
    ...

else:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'

  1. 在包含manage.py运行的文件夹中python manage.py collectstatic(对于 Django 管理站点的静态文件)

推荐阅读