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

标准视图继承自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'))
原文地址:https://www.cnblogs.com/zhongyehai/p/11795259.html