问题:
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)
结论
- 用django的manager直接运行,django自己知道静态资源在哪,可以找到,因此正常执行;
- 用uwsgi运行时,uwsgi无法找到静态资源目录,无法处理;
- 我们的django通过wsgi协议运行时不会再主动帮你提供提供静态资源寻找服务了,因此咱们需要自己在django的路由里加上匹配静态资源url的一段,用来匹配静态资源url并处理它;
解决
解决方法有三种:
- 通过uswgi处理静态资源,自行搜索uwsgi static即可找到配置方法;
- 自己通过django路由进行url匹配,进行处理静态资源;
注意:官方文档说了,解决办法2不适用于生产环境!因为要DEBUG=True才能生效! - 在配置NGINX时,在server配置里配置静态资源路径即可;
总之,解决方案就两种,要么交给web服务器解决,如uwsgi或NGINX,要么在debug模式下交给django解决,django不支持在debug=false时处理静态资源,我觉得这种设计是基于这种设计理念:
- django只专心做网站的逻辑处理部分;
- web请求处理应该交给专门的web服务器处理;
- 对于静态的不可变不需要逻辑处理的资源都应交给web服务器处理;
- 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