从dev中的子文件夹提供django:静态文件无法解析

时间:2016-07-07 09:38:24

标签: python django nginx

所以,我正在使用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

1 个答案:

答案 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。这些设置然后在开发/本地和生产中工作。