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是一个列表,里面接受装饰器的函数体