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] 
    ... ...