解决Django生产环境无法加载静态文件问题的解决
起步
线上部署时因设置了settings.DEBUG=False会导致静态文件都是404的情况。主要原因是应为关闭DEBUG模式后,Django便不提供静态文件服务了。
runserver的启动
如果运行是通过runserver命令的方式,那简单,在启动runserver指令后追加--insecure选项能参数强制django处理静态文件。
其他方式启动
但如果是通过uwsgi或daphne等启动的话,追加选项的方式就不管用了。要解决这个问题,我们要手动去使用静态文件服务,这种处理方式是比较推荐的,因为它同时也支持了runserver的方式。
解决的方式如下,在urls.py中添加url规则:
fromdjango.contrib.staticfiles.viewsimportserve fromdjango.urlsimportre_path defreturn_static(request,path,insecure=True,**kwargs): returnserve(request,path,insecure,**kwargs) urlpatterns=[ ... re_path(r'^static/(?P.*)$',return_static,name='static'),#添加这行 ]
这样就行了。
为什么这样就能解决了?
需要去做静态文件的路由匹配,但重点是这里多了个函数return_static去代理了serve,如果你稍微看下serve函数的代码就立马理解了:
defserve(request,path,insecure=False,**kwargs): ifnotsettings.DEBUGandnotinsecure: raiseHttp404
默认情况下insecure=False,并且在关闭调试模式后都是404。通过写个return_static函数其实与--insecure的选项是异曲同工的。
媒体文件的处理
媒体文件的处理当然可以将上面url规则变动下就能加载了。如果用上面的方法来处理媒体文件可以得90分,那么下面的方法可以得95分。
上面的方法会搜索多个目录的,尽管开发人员会将静态文件同一放目录下。但Django的admin模块的静态文件存放在其他地方的。
而媒体文件,我们只会限定在一个目录的,所以更好的处理方法是只在一个目录下搜索:
fromdjango.views.staticimportserveasstatic_serve#注意这里引入的与上面的不同 fromdjango.urlsimportre_path urlpatterns=[ ... re_path(r'^media/(?P.*)$',static_serve,{'document_root':settings.MEDIA_ROOT}), ]
另外,如果网站的所有静态文件都只会在一个目录下(使用collectstatic能将所有静态文件都复制到一个目录),那么也请用这个static_serve方式去处理静态文件,我们希望我们的程序是精益求精的良品。
总结
另外还有通过第三方程序来处理静态文件,比如nginx设置alias等。但显然我更希望是程序自身的处理方式。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。