给视图函数指定多个路由
flask允许通过在视图函数上方罗列多个@app.route
装饰器给某个视图函数添加多种路由访问方式。
from flask import Flask
app = Flask(__name__)
@app.route('/hello')
@app.route('/hi')
def hi():
return "你好啊!"
if __name__ == '__main__':
print(app.url_map)
app.run(debug=True)
如上例,给视图函数hi()
添加两个路由装饰器,一个为/hello
,一个为/hi
,运行脚本后,可以在浏览器地址栏输入http://127.0.0.1:5000/hello
或http://127.0.0.1:5000/hi
访问该视图函数:
http://127.0.0.1:5000/hello
http://127.0.0.1:5000/hi
代码倒数第二行的
app.url_map
为路由和视图函数的映射信息,该信息包含路由路径、访问方式、以及映射的视图函数等。本例代码运行后,输出的路由映射信息为:
Map([<Rule '/hello' (OPTIONS, HEAD, GET) -> hi>,
<Rule '/hi' (OPTIONS, HEAD, GET) -> hi>,
<Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>])
指定路由访问方式
在给视图函数添加路由装饰器时,如果不指定访问方式则默认只能使用GET
方式访问。当使用除GET方式外的其他请求方式调用该路由时,则返回405 Method Not Allowed
:
通过POST方式调用
如果需要更改为其他的请求方式,可以使用methods命名参数。该参数需要传入list的类型的字符串数据,如果仅需要支持POST请求类型,则
methods=['POST']
。
from flask import Flask
app = Flask(__name__)
@app.route('/hello', methods=['POST'])
def hi():
return "你好啊!"
if __name__ == '__main__':
print(app.url_map)
app.run(debug=True)
这里给hi视图函数的路由指定POST请求类型,通过postman以POST请求方式调用,可以看到不再返回405错误。
POST请求
不同的视图函数指定相同的路由
路由匹配视图函数有两个点:路径和请求方式。若给不同的视图函数指定相同的路由路径,且请求方式都能适配,则仅会匹配定义在前边的视图函数。
from flask import Flask
app = Flask(__name__)
@app.route('/hello')
def hi():
return "你好啊!"
@app.route('/hello')
def hello():
return "Say Hello"
if __name__ == '__main__':
print(app.url_map)
app.run(debug=True)
给hi()
、hello()
视图函数均指定路由路径为/hello
,当通过postman访问http://127.0.0.1:5000/hello
时,可以看到返回的时hi()
视图函数的内容。
http://127.0.0.1:5000/hello
如果相同路由路径的视图函数,指定的请求方式不一样,则会按实际请求方式来匹配视图函数。如代码:
from flask import Flask
app = Flask(__name__)
@app.route('/hello', methods=['POST'])
def hi():
return "你好啊!"
@app.route('/hello', methods=['PUT'])
def hello():
return "Say Hello"
if __name__ == '__main__':
print(app.url_map)
app.run(debug=True)
hi()
函数与hello()
函数路由路径均为/hello
,但一个指定POST请求类型,一个指定PUT请求类型。此时分别使用这两种访问方式访问:
POST请求
PUT请求
可以看到flask在相同路由路径情况下会按实际请求方式来匹配视图函数。