Django 静态文件 404 未找到 nginx

Posted

技术标签:

【中文标题】Django 静态文件 404 未找到 nginx【英文标题】:Django static files 404 not found nginx 【发布时间】:2016-09-24 15:13:22 【问题描述】:

我正在开发一个 Django 应用程序,我想把它放到 DigitalOcean 上,这样我就可以将它展示给未来的远程用户。我对 django 和 python 很陌生,而且我一生中从未接触过 Web 应用程序的部署,所以我有点迷失了。

我在digitalocean中使用了django droplet的一键安装,它使用了nginx和gunicorn。我能够使用 ip 地址 (159.203.58.210) 在浏览器中加载应用程序,但问题是无法加载静态文件。

我用谷歌搜索了几天,但没有任何帮助。我猜这与不允许的权限或我没有在模板和 *.py 文件中正确编写静态文件有关。

我正在使用以下命令运行我的应用程序:

python manage.py runserver localhost:9000

我使用 sqlite3 作为数据库

我的完整代码在这里: https://github.com/gbastien1/carte-interactive

在服务器上,我的应用位于 /home/django/international (international 是我的网站名称,该应用程序称为 carte_interactive)

我在 settings.py 中的静态文件设置:

STATIC_URL = '/static/'
STATIC_ROOT= '/home/django/international/carte_interactive/static'

我在 /etc/nginx/sites-enabled/django.conf 中的静态文件设置(媒体相同)

location /static 
    alias /home/django/international/carte_interactive/static;

在我的模板中,我使用 % load staticfiles % 我这样称呼我的静态文件:

% static 'carte_interactive/css/style.css' %

而在我的 .py 文件中,我有时会这样称呼那些文件,我不知道它是否正确:

app_name='carte_interactive'
json_data_url = static('carte_interactive/json/data.json')
json_data_file = open(app_name + json_data_url, 'w') <-- here

这是唯一可以在开发中访问我在views.py 中的静态文件的解决方案,但它可能是在生产中使用collectstatic 的问题,我不知道。

我似乎在服务器上使用 django 1.9.4,在开发中使用 1.9.1。

您知道为什么我的静态文件在服务器上找不到 404 但在开发中一切正常吗?

文件夹 /home/django/... 是否存在权限问题,无法让浏览器访问我的静态文件?

有没有更好的方法在 views.py 中调用我的静态文件?

提前致谢!

编辑: 我为所有模板静态文件得到的控制台错误:

http://159.203.58.210/static/carte_interactive/css/style.css 失败 加载资源:服务器响应状态为 404(未找到)

【问题讨论】:

我不明白manage.py runserver的相关性。那只是为了开发;我希望你没有在 DigitalOcean 上使用它。 我想要的只是让我的应用程序可以在线使用,所以是的,我在 digitalocean 上使用 runserver 并且它可以工作。唯一的问题是静态文件。稍后我将负责使用 gunicorn 或其他东西进行实际生产。 是 nginx 给你 404 错误吗?我通常在我的 nginx 配置中的所有目录名称和别名中使用斜杠。不过,我真的不知道这是否有什么不同。 我假设你在开发中不使用 nginx 来服务静态资产? Runserver 可以提供静态文件,但比 nginx 慢得多,一旦您一次有多个网站访问者,这就会成为一个问题。您可以删除静态的nginx别名并重新加载nginx以让runserver服务文件,以确认它是否是nginx配置中的问题。 我在 django.conf 中注释掉了 location /static ... 块并且没有改变。那是否确保文件是由 runserver 提供的,还是有其他方法?而且,控制台给我的错误是:http://159.203.58.210/static/carte_interactive/css/style.css Failed to load resource: the server responded with a status of 404 (Not Found) 【参考方案1】:

我假设您不使用 nginx 来提供静态资产 发展? Runserver 可以提供静态文件,但速度要慢得多 比 nginx,一旦你有多个 网站访问者一次。您可以删除静态的 nginx 别名 并重新加载 nginx 让 runserver 服务文件,以确认是否 这是nginx配置中的问题。 哈肯盖

我删除了 nginx 并让 Django 服务器加载静态文件,现在我可以将它展示给我未来的用户。这回答了我的问题,尽管它本身并没有解决问题!还是谢谢!

【讨论】:

以上是关于Django 静态文件 404 未找到 nginx的主要内容,如果未能解决你的问题,请参考以下文章

django nginx静态文件404

django nginx静态文件404

Django部署生产环境,静态文件不能访问404,以及图片不能访问403

在 nginx 中获取静态文件失败,出现 404

未找到 nginx 位置 404

Django HTTP 错误 404:未找到:在我的视图中使用 config.json 文件