Django是一个优秀的Python web框架,被众多python开发者所喜爱。新开这个Django专栏,并不是从零开始详细使用Django框架来开发web网页,而是用来开发api。前后分离是当前的技术栈潮流

1.Django的缓存机制
2.Django实现文件下载

1.Django的缓存机制☆☆☆

为什么我们需要缓存?

对于现在的动态网站来讲,所有的界面展示都是通过客户端请求服务端,服务端再去请求数据库,然后将请求到的数据渲染后返回给客户端。用户每次访问页面都需要去请求数据库,如果同时有多个人访问的话,对于我们的数据库的压力是相当大的。

所以我们会想,对于不是经常变更的数据,或者不需要实时更新展示的数据,我们可以将数据存放在缓存中,用户下次需要数据的时候,服务端直接从缓存中拿到数据返回给用户即可,不需要每次都去数据库查询,这样会大大降低数据库的压力,提升用户访问速度。

Django的drf提供的缓存机制有两种解决方案:

  1. drf-extensions缓存

安装:pip install drf-extensions(目前不支持Django>=3.1)

drf-extensions组件内部提供了DRF的本地内存方式的缓存方式,本地内存方式缓存在项目重启后则会消失

  • 使用装饰器方式@cache_response

    • 要求:它适用于继承了rest_framework.views.APIView的类,且需要返回一个rest_framework.response.Response的实例
1
2
3
4
5
6
7
8
9
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framwork_extensions.cache.decorator import cache_response
class GoodListView(APIView):
@cache_response()
def get(self, request, format=None):
goods = Goods.objects.all()[:10]
goods_serializer = GoodListSerializer1(goods, many=True)
return Response(goods_serializer.data)
  • 使用CacheResponseMixin
  1. 使用redis缓存(Django-redis)
  • 安装redis

在配置缓存前要先安装好 Redis ,安装成功后,确定启动了 Redis 服务,在 cmd 命令行中输入 redis-cli 就能进入到 Redis 命令行。(前提要把 Redis 的安装目录配置到环境变量,在安装过程有添加环境变量的选项,勾上即可)

  • 安装:pip install django-redis

  • settings.py 文件中配置redis

1
2
3
4
5
6
7
8
9
10
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
# "PASSWORD": "password" # 如果存在密码,需要设置密码
}
}
}
  1. 依赖说明

drf-extensions的缓存方法是基于本地的, 如果在配置中配置了基于redis,则缓存方案自动切换为redis方案

2.Django实现文件下载

  1. 利用FileResponse功能实现

安装: from django.http import HttpResponse, FileResponse

参看CSDN文章~Django实现下载文件

  1. 利用StreamingHttpResponse原生功能实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from django.http import HttpResponse, StreamingHttpResponse

def deal_zip(req):
# 判断下载文件是否存在
file_path = "static/images/workflow.zip"
if not os.path.isfile(file_path):
return HttpResponse("Sorry but Not Found the File")

def file_iterator(file_path, chunk_size=512):
"""
文件生成器,防止文件过大,导致内存溢出
:param file_path: 文件绝对路径
:param chunk_size: 块大小
:return: 生成器
"""
with open(file_path, mode='rb') as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break

try:
# 设置响应头
# StreamingHttpResponse将文件内容进行流式传输,数据量大可以用这个方法(.pdf,.mp3,.mp4等等什么样格式的文件都可以下载)
response = StreamingHttpResponse(file_iterator(file_path))
# 以流的形式下载文件,这样可以实现任意格式的文件下载
response['Content-Type'] = 'application/octet-stream'
# Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名
response['Content-Disposition'] = 'attachment;filename={file_name}{format}'.format(
file_name="workflow", format=".zip")
except Exception as e:
return HttpResponse("Sorry but Not Found the File:" + str(e))

# 在这里千万记得return,否则不会出现下载
return response

参考网站


 评论

联系我 | Contact with me

Copyright © 2019-2020 谁知你知我,我知你知深。此恨经年深,比情度日久

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议