flask-类视图


  • 标准类视图
    •  1 from flask import Flask, render_template, views, jsonify
       2
       3 app = Flask(__name__)
       4
       5
       6 class JsonView(views.View):
       7     def get_response(self):
       8         raise NotImplementedError()
       9
      10     def dispatch_request(self):
      11         response = self.get_response()
      12         return jsonify(response)
      13
      14
      15 class IndexView(JsonView):
      16     def get_response(self):
      17         context = {
      18             'username': 'ivy'
      19         }
      20         return context
      21
      22
      23 app.add_url_rule('/', view_func=IndexView.as_view('index'))
      24
      25
      26 class FakeView(object):
      27     def __init__(self):
      28         super().__init__()
      29         self.context = {
      30             'username': 'ivy',
      31         }
      32
      33
      34 class TestView(JsonView, FakeView):
      35     def get_response(self):
      36         self.context.update({'age': 23})
      37         return self.context
      38
      39
      40 app.add_url_rule('/test', view_func=TestView.as_view('test'))
      41
      42 if __name__ == '__main__':
      43     app.run()

      标准类视图必须继承自flask的view.View且自定义实现dispatch_request方法,最后在app中使用add_url_rule实现路由,第一个参数是该视图对应的路由,view_func制定该路由对应的视图,类视图采用类视图的as_view方法作为视图函数对应。


    • 利用类视图可以实现抽象视图,让子类视图自定义实现返回规则,对于一些共同的属性可以采用多继承的方式获取。
  • 基于调度的类视图
    •  1 from flask import Flask, render_template, views, jsonify
       2
       3 app = Flask(__name__)
       4
       5
       6 class LoginView(views.MethodView):
       7     def get(self):
       8         return 'get'
       9
      10     def post(self):
      11         return 'post'
      12
      13
      14 app.add_url_rule('/login', view_func=LoginView.as_view('login'))
      15
      16 if __name__ == '__main__':
      17     app.run()
      MethodView可以根据请求方法自己调用自定义类视图的方法函数,跟django的View类一样
  • 类视图使用装饰器
    •  1 from flask import Flask, views, request
       2 from functools import wraps
       3
       4 app = Flask(__name__)
       5
       6
       7 def login_required(func):
       8     @wraps(func)
       9     def wrapper(*args, **kwargs):
      10         # 模拟登陆验证
      11         name = request.args.get('name')
      12         if name:
      13             return func(*args, **kwargs)
      14         return '未登录'
      15
      16     return wrapper
      17
      18
      19 @app.route('/')
      20 @login_required
      21 def index():
      22     return 'index page'
      23
      24
      25 class IndexView(views.View):
      26     decorators = [login_required]
      27
      28     def dispatch_request(self):
      29         return 'index page view'
      30
      31
      32 app.add_url_rule('/index', view_func=IndexView.as_view('index_view'))
      33
      34 if __name__ == '__main__':
      35     app.run()

      类视图想和函数视图使用一样的装饰器,直接使用类属性decorators,  decorators是一个列表,里面接受装饰器的函数体

02-12 07:16