所以,我正在使用nginx从/my_app/
提供我的django应用程序:
location /my_app/ {
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)
但是我得到了一些疯狂的TypeError at /static/admin/css/base.css
,因为我的STATIC_ROOT是空的(我以为在dev中它应该使用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
答案 0 :(得分:0)
看起来你并不是通过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中构建文件路径,以便它们不会被硬编码。对于设置它的一些初始开销,您可以获得很大的灵活性。您可以通过进入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。这些设置然后在开发/本地和生产中工作。