flask-类视图
阅读原文时间:2023年07月08日阅读:2

flask-类视图


  • 标准类视图

    • from flask import Flask, render_template, views, jsonify

      app = Flask(__name__)

      class JsonView(views.View):
      def get_response(self):
      raise NotImplementedError()

       def dispatch\_request(self):  
           response = self.get\_response()  
           return jsonify(response)

      class IndexView(JsonView):
      def get_response(self):
      context = {
      'username': 'ivy'
      }
      return context

      app.add_url_rule('/', view_func=IndexView.as_view('index'))

      class FakeView(object):
      def __init__(self):
      super().__init__()
      self.context = {
      'username': 'ivy',
      }

      class TestView(JsonView, FakeView):
      def get_response(self):
      self.context.update({'age': 23})
      return self.context

      app.add_url_rule('/test', view_func=TestView.as_view('test'))

      if __name__ == '__main__':
      app.run()

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

    • 利用类视图可以实现抽象视图,让子类视图自定义实现返回规则,对于一些共同的属性可以采用多继承的方式获取。

  • 基于调度的类视图

    • from flask import Flask, render_template, views, jsonify

      app = Flask(__name__)

      class LoginView(views.MethodView):
      def get(self):
      return 'get'

       def post(self):  
           return 'post'

      app.add_url_rule('/login', view_func=LoginView.as_view('login'))

      if __name__ == '__main__':
      app.run()

      MethodView可以根据请求方法自己调用自定义类视图的方法函数,跟django的View类一样

  • 类视图使用装饰器

    • from flask import Flask, views, request
      from functools import wraps

      app = Flask(__name__)

      def login_required(func):
      @wraps(func)
      def wrapper(*args, **kwargs):
      # 模拟登陆验证
      name = request.args.get('name')
      if name:
      return func(*args, **kwargs)
      return '未登录'

       return wrapper

      @app.route('/')
      @login_required
      def index():
      return 'index page'

      class IndexView(views.View):
      decorators = [login_required]

       def dispatch\_request(self):  
           return 'index page view'

      app.add_url_rule('/index', view_func=IndexView.as_view('index_view'))

      if __name__ == '__main__':
      app.run()

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

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章