10. 即插视图¶
在Flask的视图中,采用OOP编程,这样就可以使用OOP的好处。
在Django中大量使用这种基于类的视图。
在这里我们主要将两种:
- 标准视图
- 基于调度方法的视图
10.1. 标准视图¶
标准视图就是一个类,需要做的步骤是:
- 继承自
flask.views.View
- 实现
dispatch_request
函数 - 实现自己的业务处理
- 利用
app.add_url_rule
注册上视图
10.1.1. 案例¶
案例利用标准视图,实现了对url=/tuling
的操作。
代码位置是./v6/plug_view.py
:
# 定义基本视图,没有处理具体业务逻辑
class BasicView(View):
# 必须实现这个函数
# 这个函数的功能是对进入的url进行分配处理
def dispatch_request(self):
if request.method != 'GET':
return self.tuling_error()
return self.handle_url()
# 子类实现对具体业务逻辑的处理
class TulingView(BasicView):
def handle_url(self):
return "Handle URL {} by TULING".format(request.url)
def tuling_error(self):
return "404 by 刘大拿"
# 注册基于类的视图
app.add_url_rule('/tuling/', view_func=TulingView.as_view("tuling_view"))
10.2. 基于调度方法的视图¶
HTTP协议一共就几个请求方法,一般我们对应每一个请求方法都需要做一个处理,所以我们的视图处理如果 能自动对每种请求方法都调用对应的处理函数就省了很大的事,
flask.views.MethodView
提供每个HTTP请求方法对应的同名函数(函数名是小写),我们可以直接继承这个函数,这在编写RESTful
请求
到时候非常有用。
一旦使用MethodView
处理,一般就不需要手动编写dispatch_request
。
代码位置是./v6/plug_view.py
:
# 使用MethodView一般就不需要使用disatch_view进行请求路径手动处理
class TulingMethodView(MethodView):
def get(selfs):
return "GET Method"
def post(self):
return "POST Method"
# 注册基于类的视图
app.add_url_rule('/tuling/', view_func=TulingView.as_view("tuling_view"))
app.add_url_rule('/method/', view_func=TulingMethodView.as_view("tuling_method_view"))
从Flask0.8版开始,MethodView中可以添加 decorators 属性来实现对视图的装饰 例如:
class TulingAPI(MethodView):
decorators = [login_required]
... ...