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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容