类视图与中间件
类视图
类视图引入
以函数的方式定义的视图成为函数视图,函数视图便于理解,但是遇到一个视图对应的路径提供了多种不同 HTTP 请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳。
比如说增删改查请求是一个链接的时候
在 Django 中也可以使用类来定义一个视图,称为类视图
使用类视图可以将视图对应的不同请求方式以类中的不同方法来区别定义。
from django.views.generic import View
class RegisterView(View):
"""类视图:处理注册"""
def get(self, request):
"""处理GET请求,返回注册页面"""
return render(request, 'register.html')
def post(self, request):
"""处理POST请求,实现注册逻辑"""
return HttpResponse('这里实现注册逻辑')
类视图的好处:
- 代码可读性好
- 类视图相对于函数视图有更高的复用性,如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可
类视图使用
定义类视图需要继承自Django提供的父类View,可使用from django.views.generic import View
或者from django.views.generic.base import View
导入,定义方式如上所示。
配置路由时,使用类视图的as_view()方法来添加。
urlpatterns = [
# 视图函数:注册
# url(r'^register/$', views.register, name='register'),
# 类视图:注册
url(r'^register/$', views.RegisterView.as_view(), name='register'),
]
类视图使用装饰器
在不违背开放封闭的前提下添加新功能
- 在 URL 配置中装饰
- 这种方式最简单,不过装饰行为在 url 配置中,不方便代码阅读,不建议使用
- 使用此种方式会为类视图中的所有请求方式都加上装饰器行为
- 在类视图中装饰
- 在类视图中使用为函数视图准备的装饰器时,不能直接添加装饰器,需要使用**method_decorator **将其转换为适用于类视图方法的装饰器。
- method_decorator 装饰器使用 name 参数指明被装饰的方法
- 如果需要为类视图的多个方法添加装饰器,但又不是所有的方法,可以直接在需要添加装饰器的方法上使用 method_decorator
类视图Mixin扩展类
使用面向对象多继承的特性,可以通过定义父类(作为扩展类),在父类中定义想要向类视图补充的方法,类视图继承这些扩展父类,便可实现代码复用。
定义的扩展父类名称通常以Mixin结尾。
中间件
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。
中间件的定义方法
中间件的代码格式和装饰器很像,都是在添加功能,
执行顺序:
- 在请求视图被处理前,中间件由上至下依次执行
- 在请求视图被处理后,中间件由下至上依次执行
定义一个中间件工厂函数,然后返回一个可以别调用的中间件。
中间件工厂函数需要接收一个可以调用的get_response对象。
返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。
def simple_middleware(get_response):
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
def middleware(request):
# 此处编写的代码会在每个请求处理视图前被调用。
response = get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用。
return response
return middleware
定义好中间件后,需要在settings.py 文件中添加注册中间件