因此,我正在使用 nginx 从 /my_app/
为我的 django 应用提供服务:
位置/我的应用程序/{
proxy_pass http://127.0.0.1:8000/;
}
我有 STATIC_URL = '/my_app/static
然后,当使用 django admin 时,对 /my_app/static/admin/css/base.css
的请求解析为 static/admin/css/base.css
。因此,它不匹配任何静态文件(因为 django 期望 /my_app/static/...
作为前缀)。
因此,我的解决方案(在开发中)是通过我自己的“静态文件服务”来提供静态文件:
] + static('/static/', document_root=settings.STATIC_ROOT)
但我在/static/admin/css/base.css 处遇到了一些疯狂的 TypeError
因为我的 STATIC_ROOT 是空的(我认为在开发中它应该使用 STATIC_ROOT)。如果我将 STATIC_ROOT 设置为任何值,它也不会解析(看起来它真的试图从静态目录提供服务而不是动态解析)。
Sooo,如何从子文件夹提供我的 Django 应用程序,以便在 dev 中动态提供静态文件?
编辑:即使使用 FORCE_SCRIPT_NAME = '/my_app/
它也不起作用,而且 django 管理中的链接也是错误的,但这是预期的
编辑 2:从 Django 1.10 开始,管理链接现在是正确的(关于 SCRIPT_NAME):https://docs.djangoproject.com/en/1.10/releases/1.10/#django-contrib-admin
最佳答案
看起来您并不是在通过 Nginx 提供静态文件。代理传递将请求发送到 django 域并将它们传递给后端的其他东西——你用什么来服务基本应用程序?假设它不是 runserver(不要这样做!),gunicorn/uwsgi 服务于 django 应用程序,而不是静态文件。 Nginx 通常将 django 请求传递给 Gunicorn 或类似工具,并提供静态文件。
我的 Nginx 基本配置如下所示。
server {
server_name mydomain.com www.mydomain.com;
access_log off;
location /static/ {
alias /var/www/mydomain.com/static/;
}
location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
}
}
我建议在 python 中构建文件路径,这样它们就不会被硬编码。对于设置它的一些初始开销,您可以获得很大的灵 active 。您可以通过进入 shell 并导入它们来检查这些解析的位置。
那么settings.py(其实是common.py,但是效果是一样的)中的静态设置是:
PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATICFILES_DIRS = [os.path.join(PROJECT_DIR, 'static'),]
BASE_DIR = os.path.dirname(PROJECT_DIR)
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
在上面的示例中,项目根目录显然位于/var/www/mydomain.com 。然后这些设置在开发/本地和生产中都有效。
关于python - 从 dev : static files not resolving 中的子文件夹提供 django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38242166/