类视图
之前我们接触的视图都是函数,所以一般简称视图函数。其实视图也可以基于类来实现,类视图的好处是支持继承,但是类视图不能跟函数视图一样,写完类视图还需要通过app.add_url_rule(url_rule,view_func)来进行注册。以下先对标准类视图进行讲解
1.标准类视图使用步骤
1. 标准类视图,必须继承自`flask.views.View`.
2. 必须实现`dipatch_request`方法,以后请求过来后,都会执行这个方法。这个方法的返回值就相当于是之前的函数视图一样。也必须返回`Response`或者子类的对象,或者是字符串,或者是元组。
3. 必须通过`app.add_url_rule(rule,endpoint,view_func)`来做url与视图的映射。`view_func`这个参数,需要使用类视图下的`as_view`类方法类转换:`ListView.as_view('list')`。
4. 如果指定了`endpoint`,那么在使用`url_for`反转的时候就必须使用`endpoint`指定的那个值。如果没有指定`endpoint`,那么就可以使用`as_view(视图名字)`中指定的视图名字来作为反转。
from flask import Flask,views,url_for
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
#定义一个类视图
class ListView(views.View):
def dispatch_request(self):
return "这是List列表"
#注册类视图
app.add_url_rule('/list/',endpoint='mlist',view_func=ListView.as_view('my_list'))
with app.test_request_context():
#若注册url时,没有指定endpoint,使用as_view()方法中的名称 来构建url
# print(url_for('my_list'))
# 若注册url时,有指定endpoint,就不能再使用as_view()方法中的名称 来构建url,而要使用endpoint的值来构建url
print(url_for('mlist'))
2.类视图的好处
1.可以继承,把一些共性的东西抽取出来放到父视图中,子视图直接拿来用就可以了。
2.但是也不是说所有的视图都要使用类视图,这个要根据情况而定。视图函数用得最多
#类视图的好处:
#需求:以后有 好几个url,都需要返回json对象的格式
class ListView2(views.View):
def getData(self):
raise NotImplementedError
def dispatch_request(self):
return jsonify(self.getData())
class JSONView(ListView2):
def getData(self):
return {'uname':'momo','age':'22'}
class JSONView2(ListView2):
def getData(self):
return {'bname':'水浒传','price':'89'}
app.add_url_rule('/json/',view_func=JSONView.as_view('my_json'))
app.add_url_rule('/json2/',view_func=JSONView2.as_view('my_json2')