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