• 二十三:视图之标准类视图的使用


    标准视图继承自flask.view.View

    as_view源码

    1、标准视图继承自flask.view.View
    2、并且在子类中必须实现dispatch_request方法,以后请求过来后,都会执行这个方法,这个方法的返回值就相当于是之前的函数视图一样,也必须返回Response或者子类的对象,或者是字符串,或者是元祖
    3、必须通过app.add_url_rule(rule, endpoint, view_func)来做url与视图的映射,view_func这个参数需要使用类视图下的as_view类方法来转换:ViewFunc.as_view('view_name')
    4、如果指定了endpoint,name在使用url_for()反转的时候,就必须使用endpoint指定的值,如果没有指定endpoint,则可以使用as_view()里面的视图名字
    5、类视图可以继承,把一些共性的东西抽取出来放到父视图中,子视图直接继承使用用可以了

    若没有给endpoint传值时,会拿as_view()里面的值作为终结点

    应用场景:
    1、如:有多个url都需要返回json数据

    from flask import Flask, render_template, views, url_for, jsonify
    app = Flask(__name__)
    # 有多个url都需要返回json数据
    class JSONView(views.View):
    def get_data(self):
    raise NotImplementedError # 继承此类的子类需自己实现get_data方法,否则抛出未定义的异常
    def dispatch_request(self):
    return jsonify(self.get_data()) # 将get_data的返回值转成json
    class ListView(JSONView): # 当有返回值只需要转json时,只需要继承JSONView,并在get_data里面获取数据即可
    def get_data(self):
    return {'a': 1, 'b': 2}
    app.add_url_rule('/list/', endpoint='list_view', view_func=ListView.as_view('list'))

    当有多个视图需要返回相同的变量的时候

    from flask import Flask, render_template, views, url_for, jsonify
    app = Flask(__name__)
    # 有多个视图,需要返回相同的变量
    class LoginView(views.View):
    def dispatch_request(self):
    return render_template('login.html', ads='这是ads信息')
    class RegistView(views.View):
    def dispatch_request(self):
    return render_template('regist.html', ads='这是ads信息')
    app.add_url_rule('/login/', view_func=LoginView.as_view('login'))
    app.add_url_rule('/regist/', view_func=RegistView.as_view('regist'))

    以上方法,如果变量信息有改动,则需要去每个视图里面改,不利于维护,可以把返回值抽出来单独封装,其他类只需要继承此类即可

    from flask import Flask, render_template, views, url_for, jsonify
    app = Flask(__name__)
    # 有多个视图,需要返回相同的变量
    class ADSView(views.View):
    def __init__(self):
    super(ADSView, self).__init__()
    self.context = {'ads': '这是ads信息'}
    class LoginView(ADSView):
    def dispatch_request(self):
    self.context.update({'aaa': 'aaa的值'}) # 如果有特殊值的情况,可以在自己的视图里面操作
    return render_template('login.html', **self.context)
    class RegistView(ADSView):
    def dispatch_request(self):
    return render_template('regist.html', **self.context)
    app.add_url_rule('/login/', view_func=LoginView.as_view('login'))
    app.add_url_rule('/regist/', view_func=RegistView.as_view('regist'))
  • 相关阅读:
    三、k8s 核心功能
    【RobotFramework】显式等待、隐式等待、强制等待
    如何快速发现缺陷
    冒烟测试知多少
    【Robot Framework】发送GET与POST请求
    Fastdfs.jar手动安装到本地仓库配置
    Lua架构
    SPU与SKU
    docker环境删除与安装配置
    idea-maven导入出现omitted for duplicate且下标标红
  • 原文地址:https://www.cnblogs.com/zhongyehai/p/11795259.html
Copyright © 2020-2023  润新知