Web开发——Flask框架

Flask框架——基于类视图

2022-08-04  本文已影响0人  白巧克力LIN

上篇文章我们学习了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方法调度的。

继承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等相关文章!

上一篇下一篇

猜你喜欢

热点阅读