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是一個列表,里面接受裝飾器的函數體
-