解决Django生产环境无法加载静态文件问题的解决


Posted in Python onApril 23, 2019

起步

线上部署时因设置了 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

默认情况下 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 方式去处理静态文件,我们希望我们的程序是精益求精的良品。

总结

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

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

Python 相关文章推荐
python将文本转换成图片输出的方法
Apr 28 Python
python实现字符串和日期相互转换的方法
May 13 Python
Python程序中用csv模块来操作csv文件的基本使用教程
Mar 03 Python
Python使用PIL模块生成随机验证码
Nov 21 Python
基于Django用户认证系统详解
Feb 21 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
Apr 11 Python
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
Python给定一个句子倒序输出单词以及字母的方法
Dec 20 Python
用python求一重积分和二重积分的例子
Dec 06 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
django使用graphql的实例
Sep 02 Python
python 实现性别识别
Nov 21 Python
Python 存储字符串时节省空间的方法
Apr 23 #Python
Django页面数据的缓存与使用的具体方法
Apr 23 #Python
Python切片操作去除字符串首尾的空格
Apr 22 #Python
详解python中的hashlib模块的使用
Apr 22 #Python
Python 中包/模块的 `import` 操作代码
Apr 22 #Python
python定时检测无响应进程并重启的实例代码
Apr 22 #Python
django query模块
Apr 20 #Python
You might like
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
修改了一个很不错的php验证码(支持中文)
2007/02/14 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
CSS心形加载的动画源码的实现
2021/03/09 HTML / CSS
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
使用js实现数据格式化
2014/12/03 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
AngularJS向后端ASP.NET API控制器上传文件
2016/02/03 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
JavaScript数组方法总结分析
2016/05/06 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
design vue 表格开启列排序的操作
2020/10/28 Javascript
Python选课系统开发程序
2016/09/02 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
python实现最长公共子序列
2018/05/22 Python
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
OpenCV 轮廓检测的实现方法
2019/07/03 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
个人违纪检讨书
2014/09/15 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
变长双向rnn的正确使用姿势教学
2021/05/31 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python