zoukankan      html  css  js  c++  java
  • 二十三:视图之标准类视图的使用

    标准视图继承自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'))
  • 相关阅读:
    215. Kth Largest Element in an Array
    214. Shortest Palindrome
    213. House Robber II
    212. Word Search II
    210 Course ScheduleII
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    206. Reverse Linked List
    sql 开发经验
  • 原文地址:https://www.cnblogs.com/zhongyehai/p/11795259.html
Copyright © 2011-2022 走看看