• Flask框架——基于类的视图


    目录

    继承View的类视图

    继承MethodView的类视图


    在上篇文章学习了Flask框架——项目可安装化,这篇文章我们学习Flask框架——基于类的视图。

    基于类的视图有两种:继承View的类视图和继承MethodView的类视图。

    基于类的视图是以类的方式实现视图函数的逻辑,封装视图函数,能够比较优雅的方式实现很多复杂的不同功能。

    例如:类的方法视图函数封装了处理get、post请求的函数,当请求方法为get就调用类中的get请求函数,当请求方法为post请求时,就调用类中的post请求函数。

    这样根据请求方法来和类中的函数形成一个绑定关系,从而达到映射的效果。

    基于类的视图好处:

    • 类是可以继承的,我们可以编写一个基础的类视图来继承特定功能的类视图,实现代码复用;

    • 可以定义多种函数实现多个功能,逻辑清晰。

    例如:Flask程序使用传统的视图函数,示例代码如下:

    1. from flask import Flask, request
    2. app=Flask(__name__)
    3. @app.route("/index/", methods=["GET""POST""PUT""DELETE"])
    4. def index(index_id):
    5.     method = request.method
    6.     if method == "GET":
    7.         if user_id is None:
    8.             .....
    9.         return f"get {index_id}"
    10.     elif method == "post":
    11.         .....
    12.         return f"post {index_id}"
    13.     elif method=='PUT':
    14.         .....
    15.         return '......'
    16.     ....
    17.     return "其他的方法判断"
    18. if __name__ == '__main__':
    19.     app.run(debug=True)

    在传统的视图函数中,我们通常会在视图函数中添加很多if判断来满足不同的请求类型,如果判断的代码有很多,那么在一个视图函数中就显得很臃肿,不利于我们后期进行维护。

    这时我们可以使用基于类的视图函数——继承View的类视图。

    继承View的类视图

    Flask示例代码如下:

    1. from flask.views import View
    2. from flask import Flask, request
    3. class index(View):    #创建index类继承View
    4.     methods = ["GET""POST"]  #该类接收的请求类型
    5.     def get(self):    #get请求
    6.         return "get"
    7.     
    8.     def post(self):    #post请求
    9.         return "post"
    10.     
    11.     def dispatch_request(self):  #重写dispatch_request方法
    12.         request_method = {"get": self.get, "post": self.post}  #请求类型和请求方法绑定
    13.         view = request_method.get(request.method.lower())  #通过请求方法,映射到对应的函数对象
    14.         return view()         #返回view值
    15.         
    16. app = Flask(__name__)
    17. app.add_url_rule("/index", view_func=index.as_view("index"))  #注册视图函数
    18. if __name__ == '__main__':
    19.     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程序示例代码如下:

    1. from flask.views import MethodView
    2. from flask import Flask
    3. class index(MethodView):      #创建index类并继承MethodView类
    4.     def get(self):         #get请求
    5.         return "get"
    6.     def post(self):      #post请求
    7.         return "post"
    8. app = Flask(__name__)
    9. app.add_url_rule("/index", view_func=index.as_view("index"))  #注册视图函数
    10. if __name__ == '__main__':
    11.     app.run(debug=True)

    对比传统视图函数、继承View的类视图和继承MethodView的类视图,明显继承MethodView的类视图结构和逻辑更清晰。

    那么怎么满足不同的请求类型呢?

    假如我有个名为total类,该类继承了MethodView类,如下所示:

    1. class total(MethodView):      #创建total类并继承MethodView类
    2.     def get(self):         #get请求
    3.         return "get"
    4.     def post(self):      #post请求
    5.         return "post"
    6.         
    7.     def put(self):      #put请求
    8.         return "put"
    9.         
    10.     def delete(self):     #delete请求
    11.         return "delete"

    该类可以处理不同的请求类,如get、post、put和delete请求,那么怎样实现不同的url请求类型返回对应的请求函数呢。方法很简单,如下所示:

    1. view_func = total.as_view("total")
    2. app.add_url_rule("/projects", view_func=view_func, methods=["GET"])
    3. app.add_url_rule("/project/create", view_func=view_func, methods=["POST"])

    只要在使用add_url_rule绑定视图时,添加methods参数即可。

    好了,Flask框架——基于类的视图就讲到这里了,感谢观看,下篇文章学习Flask框架——应用错误处理!!

    公众号:白巧克力LIN

    该公众号发布Python、数据库、Linux、Flask、自动化测试、Git等相关文章!

    - END -

  • 相关阅读:
    写个俄罗斯方块,感受嵌入式linux应用开发
    论文阅读笔记(通道注意力)
    阿里云SLB之:基于多域名调度的SLB七层负载均衡配置(十四)
    C++ - STL 使用红黑树封装map set
    ruoyi框架修改左侧菜单样式
    dart中final和const的区别
    运动想象 (MI) 迁移学习系列 (9) : 数据对齐(EA)
    libnet
    SSO 和 OAuth2.0 的关系是什么?
    将狼才鲸的嵌入式开源项目仓库链接
  • 原文地址:https://blog.csdn.net/weixin_52122271/article/details/126151362