flask-類視圖


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM