Flask[相识]

Flask[相识]

七月 03, 2023

路由规则管理

一般情况有两种添加路由规则的方式

1、使用route添加路由规则

1
2
3
@app.route('/add_url')
def add_rule():
return 'add url rule'

2、使用add_url_rule添加路由规则

1
2
3
4
5
def add_rule():
return 'add url rule'


app.add_url_rule('/add_url', 'add_rule', add_rule)

两种方式的结果是相同的,route装饰器中也是调用了 add_url_rule方法添加路由规则。

更深层的学习可以参考todo。

设置method

一个URL可以用多种不同的方法请求,创建路由规则时,我们可以指定这个URL支持哪些请求方法。

1
2
3
@app.route('/users', methods=['GET', 'POST'])
def users():
return 'ok'

在route装饰器中设置methods参数来决定支持的请求方法,不设置默认仅支持GET请求。

users函数既要处理GET请求,又要处理POST请求,那么如何区分它们呢? 这就要用到请求对象request

通过获取requst的method属性,即可得到请求的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from flask import Flask, request
app = Flask(__name__)


@app.route('/users', methods=['GET', 'POST'])
def users():
if request.method == 'GET':
return 'get'
if request.method == 'POST':
return 'post'

return 'ok'


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

Flask视图

到底什么是视图呢?

视图函数

通过route装饰器,将url/hello与 函数hello 关联在一起,我们称这个函数就是视图函数。

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

一个视图函数用来处理一个请求,最终返回数据。

视图类

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

  1. flask.views.View

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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')) #将函数绑定到Userview

    # userrView类中并没有名为 users 的方法,那么这个字符串参数意义何在呢?

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

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

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

  2. flask.views.MethodView

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

MethodView会自动的为视图类做好路由,不同的请求,会被路由到不同的处理方法上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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方法。