Nginx 不提供 Django 管理静态文件

smi*_*omb 2 django nginx gunicorn django-staticfiles

404 URL 示例:

http://ip.address/static/admin/css/base.css

我不确定我做错了什么。这是关联的文件:

设置.py

STATICFILES_DIRS = [
  '/home/username/sitename/sitenameenv/lib/python3.5/site-packages/django/contrib/admin/static',
]
STATIC_URL = '/static/'
STATIC_ROOT = '/home/username/sitename/website/staticroot/'
Run Code Online (Sandbox Code Playgroud)

Nginx 配置:

server {
    listen 80;
    server_name http://ip.address/;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/username/sitename/website/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/username/sitename/sitename.sock;
    }
}
Run Code Online (Sandbox Code Playgroud)

常规静态文件正在正确提供,并且在我添加STATIC_ROOT和使用之前它们也在这样做collectstatic,我认为这是没有必要的。不过,我的管理员因其静态文件而收到 404 错误。

xyr*_*res 7

更新:

运行collectstatic将收集设置指定的目录中的所有文件STATIC_ROOT

因此,您需要配置 Nginx 服务器来为您的STATIC_ROOT文件夹提供以下/satic/url 服务:

location /static/ {
    # using `alias` instead of `root`
    # vvv
    alias   /home/username/sitename/website/staticroot/;
            #                                  ^^^
            # the full path to the STATIC_ROOT directory
}
Run Code Online (Sandbox Code Playgroud)

旧版本(不是很有用):

为什么会发生这种情况?

这里有一件重要的事情需要注意:Django 不提供静态文件。我相信你知道这一点。

因此,当您的浏览器从 - 请求管理 css 文件时 http://ip.address/static/admin/css/base.css,该请求会被您的 Nginx 服务器拦截,因为您已将/static/路径映射到该目录 - /home/username/sitename/website/static/

现在,接下来发生的是,Nginx 将尝试/admin/css/base.css/home/username/sitename/website/static/. 但那里没有任何admin目录,因此该请求最终作为404.


如何解决这个问题?

您可以将/static/admin/url 映射到该目录admin实际所在的目录。例子:

# put this before `location /static/` conf

location /static/admin/ {
    root   /home/username/sitename/sitenameenv/lib/python3.5/site-packages/django/contrib/admin/;
}
Run Code Online (Sandbox Code Playgroud)