获取请求URL中的查询字符串
请求url: http://127.0.0.1:5000/hello?name=bob
from flask import Flask, request, redirect
app = Flask(__name__)
@app.route('/hello' )
def hello():
name = request.args.get('name', 'Flask') # 获取查询参数name的值,name为key, Flask为默认值
return 'Hello, %s!
' % name # 插入到返回值中
路由匹配
flask为了将请求的URL匹配到对应视图函数,flask中存储了一个路由表(app.url_map)其中定义了URL规则和视图函数的映射。
如果找到了对应的视图函数,将展示。否则显示404。
可以通过flask routes来展示app.url_map表中解析到的数据
(helloflask) PS G:\python\helloflask\demoflask\demos\http> flask routes
Endpoint Methods Rule
------------ --------- -------------------------------------
go_back GET /goback/
go_back1 GET /goback1/
hello GET, POST /hello
hello1 GET /hello1
hello2 GET /hello2
hello_world GET /
static GET /static/
three_colors GET /colors/
从这里我们可以看到每个路由或者说是接口对应的方法,参数等信息
设置HTTP方法
在flask中,我们可以通过在@app.route()装饰器后设置http请求的方法,类似springboot中的requestMapping
from flask import Flask, request, redirect
app = Flask(__name__)
@app.route('/hello', methods={'POST', 'GET'})
def hello():
name = request.args.get('name', 'Flask') # 获取查询参数name的值,name为key, Flask为默认值
return 'Hello, %s!
' % name # 插入到返回值中
如果请求的方法的方式和设置的不符合,将提示405(Method Not Allowed)
设置URL请求中的参数
因为flask默认请求的URL为字符串,所以Flask内置了URL变量转换器
转换器 | 说明 |
---|---|
string | 不包含斜线字符串, 默认 |
int | 整形 |
float | 浮点型 |
path | 包含斜线的字符串 |
any | 匹配一系列给定值中的一个元素 |
uuid | UUID字符串 |
from flask import Flask, request, redirect
app = Flask(__name__)
@app.route('/goback/') # 限定了参数year必须是数字,否则返回404
def go_back(year):
return 'Welcome to %d' % (2021 - year)
from flask import Flask, request, redirect
app = Flask(__name__)
@app.route('/colors/') # 定义了一个枚举类型一样,并且指定了返回状态码
def three_colors(color):
return 'Love is patient and kind. Love is not jealous or boastful or proud or rude
', 201
请求钩子
其实个人比较难理解什么是钩子,书上是认为请求的预处理和后处理被认为是一个钩子。
钩子 | 说明 |
---|---|
before_first_request | 注册一个函数,在处理第一个请求前运行 |
before_request | 注册一个函数,在处理每个请求前运行 |
after_request | 注册一个函数,如果没有未处理的异常抛出,会在每个请求结束后运行 |
teardown_request | 注册一个函数,即使有未处理的异常抛出,会在每个请求结束后运行。如果发生异常,会传入异常对象作为参数到注册的函数中 |
after_this_requtest | 会在视图函数内注册一个函数,会在这个请求结束后运行 |
from flask import Flask, request, redirect
app = Flask(__name__)
@app.before_request
def do_something():
print("登录了吗")
PS:after_request和after_this_request钩子必须接受一个响应对象作为参数,并且返回一个响应对象。