flask 视图

在前面的两篇教程中,你已经接触到了视图,只是我没有指出什么是视图。编程中的许多概念,并不能像生活中的许多概念一样找到一个具体的与之相对应的实物,比如我说鸡蛋,你立刻想到了鸡蛋的样子。我说flask 视图,即便是明白了解的人,也难以准确的想到一个具体的实物与之相对应,这一点,你要习惯。

1. 视图函数

@app.route('/hello')
def hello():
    return 'hello'

通过route装饰器,将一个url /hello 与 函数hello 关联在一起,我们称这个函数就是视图函数。请注意,视图函数并不是python中的概念,而是flask中的一个概念,一个视图函数用来处理一个请求,最终返回数据。

基于函数的视图是最简单便捷的用法,出于设计模式的考虑,如果能用类来处理请求,某些情况下,系统架构会更加合理,更易于扩展。

flask提供了两个两个视图类,我们可以继承这两个类中的一个,实现自己的类视图

2. flask.views.View

继承flask.views.View,必须实现dispatch_request方法以处理请求,下面是一个简单的示例

from flask import Flask, request
from flask.views import View

app = Flask(__name__)

class UserView(View):
    methods = ['GET']

    def dispatch_request(self):
        print(request.method)
        return 'ok'

app.add_url_rule('/users', view_func=UserView.as_view('users'))

if __name__ == '__main__':
    app.run(debug=True)

as_view方法返回的是一个View类里的一个方法,类里的方法本质上仍然是函数, methods 规定这个视图类可以处理的请求方法。

这样设计,我们可以把处理请求的相关代码抽象成不同的方法写在UserView类里,这样便于管理。

3. flask.views.MethodView

个人更喜欢MethodView,View类里,如果一个资源支持多种请求方式,get,post,put,delete等等,那么你不得不在dispatch_request方法里根据request.method对他们进行区分,然后调用不同的处理方法进行响应,对各种请求的路由是由你自己完成的。

而MethodView则帮你做好了路由,不同的请求,会被路由到不同的处理方法上

from flask import Flask, request
from flask.views import MethodView

app = Flask(__name__)

class UserView(MethodView):
    def get(self):
        return "收到get请求"

    def post(self):
        return '收到post请求'


app.add_url_rule('/users', view_func=UserView.as_view('users'))

if __name__ == '__main__':
    app.run(debug=True)

这种设计和tornado的处理方式是一样的,MethodView是View的子类,它实现了dispatch_request方法,如果请求的get请求,则路由到get方法,就是这么简单

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案