python - 从 dev : static files not resolving 中的子文件夹提供 django

标签 python django nginx

因此,我正在使用 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/

相关文章:

python - 将一个可能很大的文本文件上传到 Python 中的普通 WSGI 服务器

Django:为什么我的开发服务器无法工作?

nginx: [emerg] "http"指令在/etc/nginx/sites-enabled/default:1 中是不允许的

Nginx Module http_stub_status_module 安装后加载问题

python - 如果使用 pypm 安装 django,pydev 会检测到它吗?

python - 在 csr_matrix 中保留每行 6 个最大的元素

python - 使用pymssql从查询结果中获取列名

分布式设置中的 Django SECRET_KEY

python - 在 django 模板中格式化数字

laravel - 本地域的 SSL