起步

线上部署时因设置了 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/("color: #ff0000">为什么这样就能解决了?

需要去做静态文件的路由匹配,但重点是这里多了个函数 return_static 去代理了 serve ,如果你稍微看下 serve 函数的代码就立马理解了:

def serve(request, path, insecure=False, **kwargs):
  if not settings.DEBUG and not insecure:
    raise Http404

默认情况下 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/("_blank" href="https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#collectstatic" rel="external nofollow" >collectstatic 能将所有静态文件都复制到一个目录),那么也请用这个 static_serve 方式去处理静态文件,我们希望我们的程序是精益求精的良品。

总结

另外还有通过第三方程序来处理静态文件,比如 nginx 设置 alias 等。但显然我更希望是程序自身的处理方式。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?