Flask框架——基于类视图
上篇文章我们学习了Flask框架——项目可安装化,这篇文章我们学习Flask框架——基于类的视图。
基于类的视图有两种:继承View的类视图和继承MethodView的类视图。
基于类的视图是以类的方式实现视图函数的逻辑,封装视图函数,能够比较优雅的方式实现很多复杂的不同功能。
例如:类的方法视图函数封装了处理get、post请求的函数,当请求方法为get就调用类中的get请求函数,当请求方法为post请求时,就调用类中的post请求函数。
这样根据请求方法来和类中的函数形成一个绑定关系,从而达到映射的效果。
基于类的视图好处:
- 类是可以继承的,我们可以编写一个基础的类视图来继承特定功能的类视图,实现代码复用;
- 可以定义多种函数实现多个功能,逻辑清晰。
例如:Flask程序使用传统的视图函数,示例代码如下:
from flask import Flask, request
app=Flask(__name__)
@app.route("/index/<index_id>", methods=["GET", "POST", "PUT", "DELETE"])
def index(index_id):
method = request.method
if method == "GET":
if user_id is None:
.....
return f"get {index_id}"
elif method == "post":
.....
return f"post {index_id}"
elif method=='PUT':
.....
return '......'
....
return "其他的方法判断"
if __name__ == '__main__':
app.run(debug=True)
在传统的视图函数中,我们通常会在视图函数中添加很多if判断来满足不同的请求类型,如果判断的代码有很多,那么在一个视图函数中就显得很臃肿,不利于我们后期进行维护。
这时我们可以使用基于类的视图函数——继承View的类视图。
继承View的类视图
Flask示例代码如下:
from flask.views import View
from flask import Flask, request
class index(View): #创建index类继承View
methods = ["GET", "POST"] #该类接收的请求类型
def get(self): #get请求
return "get"
def post(self): #post请求
return "post"
def dispatch_request(self): #重写dispatch_request方法
request_method = {"get": self.get, "post": self.post} #请求类型和请求方法绑定
view = request_method.get(request.method.lower()) #通过请求方法,映射到对应的函数对象
return view() #返回view值
app = Flask(__name__)
app.add_url_rule("/index", view_func=index.as_view("index")) #注册视图函数
if __name__ == '__main__':
app.run(debug=True)
首先我们创建名为index的类,添加请求类型并为每种请求类型添加函数,重写dispatch_request()方法来为请求类型和请求方法进行绑定,这样当我们接收不同类型的请求就可以调用对应的请求方法,最后通过app.add_url_rule()方法来注册视图函数,其中第一个参数为URL,第二个参数是视图函数名,需要使用as_view()方法把类转换为实际的视图函数,上面的视图函数名为index。
注意:
- 基于类的视图函数要基础View;
- 必须重写dispatch_request方法,主要实现请求调度的作用;
- 请求类型可以放在类的methods属性里面;
- 基于类的视图不能用@app.route装饰器来注册路由,只能用add_url_rule方法绑定视图。
继承View的类视图核心是基于dispatch_request方法调度的。
继承MethodView的类视图
对比传统的视图函数和继承View的类视图,继承View的类视图虽然逻辑比较清晰了,但代码更多了,这主要是继承View的类视图需要重写dispatch_request()方法,这时我们可以使用继承MethodView的类视图,它里面帮我们用获取类属性的方式重写了dispatch_request方法,这样我们就不需要再重写dispatch_request方法。
Flask程序示例代码如下:
from flask.views import MethodView
from flask import Flask
class index(MethodView): #创建index类并继承MethodView类
def get(self): #get请求
return "get"
def post(self): #post请求
return "post"
app = Flask(__name__)
app.add_url_rule("/index", view_func=index.as_view("index")) #注册视图函数
if __name__ == '__main__':
app.run(debug=True)
对比传统视图函数、继承View的类视图和继承MethodView的类视图,明显继承MethodView的类视图结构和逻辑更清晰。
那么怎么满足不同的请求类型呢?
假如我有个名为total类,该类继承了MethodView类,如下所示:
class total(MethodView): #创建total类并继承MethodView类
def get(self): #get请求
return "get"
def post(self): #post请求
return "post"
def put(self): #put请求
return "put"
def delete(self): #delete请求
return "delete"
该类可以处理不同的请求类,如get、post、put和delete请求,那么怎样实现不同的url请求类型返回对应的请求函数呢。方法很简单,如下所示:
view_func = total.as_view("total")
app.add_url_rule("/projects", view_func=view_func, methods=["GET"])
app.add_url_rule("/project/create", view_func=view_func, methods=["POST"])
只要在使用add_url_rule绑定视图时,添加methods参数即可。
好了,Flask框架——基于类的视图就讲到这里了,感谢观看,下篇文章学习Flask框架——应用错误处理。
公众号:白巧克力LIN
该公众号发布Python、数据库、Linux、Flask、自动化测试、Git等相关文章!