Django自定义static视图-不用自带的static

1 为什么不使用自带的static

用自带的static的时候,如果用python3 manage.py runserver 启动则没有问题,但是一旦部署到gunicorn中就会出现static无法访问,我找了很多办法,都没有解决,最后我决定自己在视图中写一个static视图,来专门返回静态文件

2 在urls.py中匹配static的路由

from django.urls import re_path
from app1 import views # 导入你的app的视图

urlpatterns = [
	# 匹配静态路由
    re_path('^static/.*$', views.static), 
    ...
    ]

3 在你的app的视图中添加处理函数

# 返回静态文件
from django.http import StreamingHttpResponse
from MVonline1.settings import BASE_DIR # 你的设置
from wsgiref.util import FileWrapper
import mimetypes
def static(req):
    path =  BASE_DIR + req.path_info 
    content_type, encoding = mimetypes.guess_type(path)
    resp = StreamingHttpResponse(FileWrapper(open(path, 'rb')), content_type=content_type)
    resp['Cache-Control']="max-age=8640000"  
    # 静态文件最好加上这句让浏览器缓存,不然会重复请求
    return resp

在setting.py中注释自带的staticfiles


INSTALLED_APPS = [
    .....
    # 'django.contrib.staticfiles',  # 取消自带的static
    # 你的app
    'app1',
    
]

在setting中搜索STATIC,看看如果有
STATIC_ROOT, STATIC_URL, STATIC之类的注释掉

5 最后只要用/static/XXX就可以访问你的static目录了

你的static目录要放在根目录BASE_URL下面,与manage.py同级,当然你也可以修改static视图函数的这句话来调整

path =  BASE_DIR + req.path_info

不过还是建议放在根目录
这样你任何app的都可以通过/static/来获取静态文件
例如在html中

<script src="/static/app1/jquery.min.js">

用这种方法,如何在哪里部署,用什么部署,都可以方便的访问静态目录,至于是否会降低效率,让服务器过载的后果,我没有去考虑过。

6 欢迎大家踊跃提出意见,留言评论点赞批评

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值