内容简介:线上部署时因设置了如果运行是通过但如果是通过
起步
线上部署时因设置了 settings.DEBUG = False
会导致静态文件都是 404 的情况。主要原因是应为关闭DEBUG模式后,Django 便不提供静态文件服务了。
runserver 的启动
如果运行是通过 runserver
命令的方式,那简单,在启动 runserver 指令后追加 --insecure
选项能参数强制 django 处理静态文件。
其他方式启动
但如果是通过 uwsgi
或 daphne
等启动的话,追加选项的方式就不管用了。要解决这个问题,我们要手动去使用静态文件服务,这种处理方式是比较推荐的,因为它同时也支持了 runserver
的方式。
解决的方式如下,在 urls.py
中添加 url 规则:
from django.contrib.staticfiles.views import serve from django.urls import re_path def return_static(request, path, insecure=True, **kwargs): return serve(request, path, insecure, **kwargs) urlpatterns = [ ... re_path(r'^static/(?P<path>.*)$', return_static, name='static'), # 添加这行 ]
这样就行了。
为什么这样就能解决了?
需要去做静态文件的路由匹配,但重点是这里多了个函数 return_static
去代理了 serve
,如果你稍微看下 serve
函数的代码就立马理解了:
def serve(request, path, insecure=False, **kwargs): if not settings.DEBUG and not insecure: raise Http404 # code...
默认情况下 insecure=False
,并且在关闭调试模式后都是 404。通过写个 return_static
函数其实与 --insecure
的选项是异曲同工的。
媒体文件的处理
媒体文件的处理当然可以将上面 url 规则变动下就能加载了。如果用上面的方法来处理媒体文件可以得 90 分,那么下面的方法可以得 95 分。
上面的方法会搜索多个目录的,尽管开发人员会将静态文件同一放目录下。但 Django 的 admin
模块的静态文件存放在其他地方的。
而媒体文件,我们只会限定在一个目录的,所以更好的处理方法是只在一个目录下搜索:
from django.views.static import serve as static_serve # 注意这里引入的与上面的不同 from django.urls import re_path urlpatterns = [ ... re_path(r'^media/(?P<path>.*)$' , static_serve, { 'document_root' : settings.MEDIA_ROOT}), ]
另外,如果网站的所有静态文件都只会在一个目录下(使用 collectstatic
能将所有静态文件都复制到一个目录),那么也请用这个 static_serve
方式去处理静态文件,我们希望我们的程序是精益求精的良品。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- webpack中如何加载静态文件
- [OpenGL]未来视觉6-静态图片纹理加载
- thinkphp5 加载静态资源路径与常量
- 借助 Webpack 静态分析能力实现代码动态加载
- 静态库遇到静态库
- 全局变量,静态全局变量,局部变量,静态局部变量
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Spring in Action
Craig Walls / Manning Publications / 2011-6-29 / USD 49.99
Spring in Action, Third Edition has been completely revised to reflect the latest features, tools, practices Spring offers to java developers. It begins by introducing the core concepts of Spring and......一起来看看 《Spring in Action》 这本书的介绍吧!