关于django+uwsgi+nginx出现静态资源404问题合集

问题:

1.Django 直接运行,没问题,静态资源等都正常;
2.Django + uwsgi运行,页面正常,静态资源找不到了;

分析:

翻阅官方文档,发现这么一段:
原文:https://docs.djangoproject.com/zh-hans/3.0/howto/static-files/


若你使用了前文所述的 django.contrib.staticfiles, runserver 会在 DEBUG 为 True 时自动处理。若你未在 INSTALLED_APPS 中包含 django.contrib.staticfiles,你仍能手动通过 django.views.static.serve() 为静态文件提供服务。

这不适合生产环境!常见的部署策略请参考 部署静态文件。

例如,若 STATIC_URL 为 /static/,STATIC_ROOT为你的静态资源存放路径,你能通过添加以下代码片段至 urls.py 完成目的:

from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

结论

  1. 用django的manager直接运行,django自己知道静态资源在哪,可以找到,因此正常执行;
  2. 用uwsgi运行时,uwsgi无法找到静态资源目录,无法处理;
  3. 我们的django通过wsgi协议运行时不会再主动帮你提供提供静态资源寻找服务了,因此咱们需要自己在django的路由里加上匹配静态资源url的一段,用来匹配静态资源url并处理它;

解决

解决方法有三种:

  1. 通过uswgi处理静态资源,自行搜索uwsgi static即可找到配置方法;
  2. 自己通过django路由进行url匹配,进行处理静态资源;
    注意:官方文档说了,解决办法2不适用于生产环境!因为要DEBUG=True才能生效!
  3. 在配置NGINX时,在server配置里配置静态资源路径即可;

总之,解决方案就两种,要么交给web服务器解决,如uwsgi或NGINX,要么在debug模式下交给django解决,django不支持在debug=false时处理静态资源,我觉得这种设计是基于这种设计理念:

  1. django只专心做网站的逻辑处理部分;
  2. web请求处理应该交给专门的web服务器处理;
  3. 对于静态的不可变不需要逻辑处理的资源都应交给web服务器处理;
  4. django自带的web服务器只是为了调试应用;

另外:
STATICFILES_DIRS 列表中的目录是开发时创建的静态目录。
STATIC_ROOT 是Django框架放到生产环境中的唯一的一个静态目录  
而当你设置DEBUG=False时,就必须在Django框架前端部署nginx或者其他web服务器来提供静态访问入口

参考:
https://note.qidong.name/2017/07/uwsgi-serve-django-static/
https://docs.djangoproject.com/zh-hans/3.0/howto/static-files/
https://docs.djangoproject.com/zh-hans/3.0/howto/static-files/deployment/
https://www.cnblogs.com/zhming26/p/6163952.html

发布了130 篇原创文章 · 获赞 105 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/THMAIL/article/details/104080471