Django 媒体文件在开发中服务,但不在生产中。无论我通过 Django admin 上传什么图像,它都会在本地主机上的网站上提供服务,但是当我将我的网站放在数字海洋上时,它不会显示。任何人都可以告诉如何解决这个问题?我的网站网址- http://139.59.56.161 点击图书测试菜单
1 回答
复活一个早已死去的问题,这是我在这里能找到的所有帮助我的方法。记录我的答案以备后人。我的“生产”环境在托管我的 django 应用程序的 uwsgi 前使用 nginx 作为反向代理。解决方案是 Django 只是不在生产环境中提供文件;相反,您应该配置您的网络服务器来做到这一点。
Django 在谈论静态文件然后说“媒体文件:相同”时略有帮助。
所以,我相信最好提前捕获文件请求,在我的例子中是在 nginx 服务器中,以减少双重处理,而且你的前端 web 服务器是最适合这项工作的。
为此:在 /etc/nginx/sites-available/[site.conf] 中的服务器定义块中,定义 webroot,即服务器文件系统上的目录,它包含声明“root [dir]”的所有内容。
server {
listen 80;
server_name example.com www.example.com;
root /srv/;
下一个块告诉 nginx 将所有流量发送到运行 django 的 uwsgi 服务 - 我从可能在 digitalocean.com 上的一个示例中提取了它 holus bolus。
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Client-Verify SUCCESS;
proxy_set_header X-Client-DN $ssl_client_s_dn;
proxy_set_header X-SSL-Subject $ssl_client_s_dn;
proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/mysite6.sock;
}
现在,这里是我们需要在请求文件时提供文件的位。try_files 尝试先服务 $uri,然后服务 $uri/,最好将类似“resource_not_found.html”的文件放在 /srv 中并将其设置为 try_files 的最后一个备用,这样用户就知道这部分有无意间被留空了。
location /static/ {
try_files $uri $uri/ ;
}
location /media/ {
try_files $uri $uri/ ;
}
}
这结束了我们的 http 服务器块,因此额外关闭了“}”。
或者,您可以通过设置 'static-map' 或 'static-map2' 让 uwsgi 执行此操作。'static-map' “吃掉”映射的 url 部分,而 static-map2 添加它。
static-map /files=/srv/files
表示对 /files/funny.gif 的请求将服务于 /srv/files/files.gif。
static-map2 /files=/srv
会做同样的事情,因为它会请求 /files/funny.gif 并查找 /srv/files/funny.gif。根据 uwsgi 文档,您可以根据需要创建任意数量的这些映射,甚至可以创建相同的 uri,并且它们将按出现顺序进行检查。该死的,我刚刚终于找到了nginx 开源的文档。