【问题标题】:Serving django from sub-folder in dev: static files not resolving从 dev 中的子文件夹服务 django:静态文件无法解析
【发布时间】:2016-11-09 13:50:54
【问题描述】:

所以,我正在使用 nginx 从/my_app/ 为我的 django 应用程序提供服务:

location /my_app/ { proxy_pass http://127.0.0.1:8000/; }

我有STATIC_URL = '/my_app/static

然后,当使用 django 管理员时,对/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 是空的(我想在开发中它应该使用 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

【问题讨论】:

    标签: python django nginx


    【解决方案1】:

    看起来您不是通过 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 。然后这些设置在开发/本地和生产中都有效。

    【讨论】:

    • 这里我的目标是使用开发服务器为应用程序提供服务,因为我想通过完全集成 nginx 来进行开发。在您的配置中,您直接从根目录提供服务,这就是为什么它很容易+您使用默认的/static/ url。所以,这对我的情况不是很有帮助,但谢谢。
    • 由于code.djangoproject.com/ticket/25598,这将不起作用,指向静态文件的链接将被破坏(/static... 而不是预期的/myapp/static/...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2016-04-05
    • 2013-12-08
    • 2016-12-22
    相关资源
    最近更新 更多