0%

微信小程序——django的类视图

django的类视图


使用类视图进行HTTP请求方法逻辑分离


函数视图的弊端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def image(request):
if request.method == 'GET':
md5 = request.GET.get('md5')
imgfile = os.path.join(settings.IMAGES_DIR, md5 + '.jpg')
print(imgfile)
if os.path.exists(imgfile):
data = open(imgfile, 'rb').read()
return HttpResponse(content=data, content_type='image/jpg')
# return FileResponse(open(imgfile, 'rb'), content_type='image/jpg')
else:
return Http404()
elif request.method =='POST':
pass
elif request.method == 'PUT':
pass
elif request.method == 'DELETE':
pass

之前的函数视图都是用 GET 去查询信息,POST 提交信息,PUT 修改信息 ,DELETE 删除信息

但是,如果每一个业务请求都有业务逻辑,那么就会使得这个函数变得非常长。因为,对于相同的函数请求,我们有四种应答。

使用类视图

引入

from django.views import View

我们定义一个类:

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
class ImageView(View):
def get(self,request):
md5 = request.GET.get('md5')
imgfile = os.path.join(settings.IMAGES_DIR, md5 + '.jpg')
print(imgfile)
if os.path.exists(imgfile):
data = open(imgfile, 'rb').read()
return HttpResponse(content=data, content_type='image/jpg')
# return FileResponse(open(imgfile, 'rb'), content_type='image/jpg')
else:
return Http404()
def post(self,request):
message = 'post method success'
resonse = utils.response.wrap_json_response(message=message)
return JsonResponse(data=resonse,safe=False)

def put(self,request):
message = 'put method success'
resonse = utils.response.wrap_json_response(message=message)
return JsonResponse(data=resonse, safe=False)

def delete(self,request):
message = 'delete method success'
resonse = utils.response.wrap_json_response(message=message)
return JsonResponse(data=resonse, safe=False)

这个类里面有get,post,put,delete方法,当对应的请求来的时候,会自动调用相应的方法,然后,我们修改应用的路由

类的路由,和方法的路由不一样,需要调用一个这个类,然后调用这个类的自有方法

1
2
3
4
5
6
urlpatterns = [
# path('', weather.helloworld)
path('weather', weather.weather),
path('menu', menu.get_menu),
path('image',image.ImageView.as_view())
]


python Mixin模式与类视图


python的Mixin模式

传统的继承好像左边的图,是 is a 的关系。

喜鹊是一个动物。

但是,如果继承链条非常长的话,就会导致这个业务逻辑越来越负责,所以,python引入了Mixin模式,他是 it can 的关系。

这样就会简化代码。

之前的代码结构,image.py调用response.py的函数。

image.py

response.py

注意,这个类有一个修饰

@classmethod

现在修改代码,采用 Mixin 的方式。

response.py

image.py

请我喝杯咖啡吧~