Python Flask 编程 | 连载 03 - Flask 请求
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
一、Flask 请求
上下文对象 context,类似容器,存储了一些关键信息
- 应用上下文
- 请求上下文
- 在分派请求之前激活应用上下文和请求上下文
- 请求处理完之后将其删除
应用上下文对象 application context
应用上下文对象有两个,分别是 current_app 表示当前应用的实例以及 g 表示处理请求时临时存储对象,每次请求都会重设这个变量,并且 g 对象时线程隔离的,使用g对象需要导入,g 既 global。
在 app.py 中的 index 视图函数中打印出 current_app 和 g
from flask import current_app, g
@app.route('/')
def index():
print(current_app)
print(type(current_app))
print(dir(current_app))
print(g)
print(type(g))
print(dir(g))
print(current_app is app)
info = {
'message': "这是存在message变量中的信息",
}
return render_template('index.html', info=info)
current_app 是一个 Flask 类,包含了路由、响应、设置、模板等各种方法。
g 临时对象中包含了 get 方法、pop 方法和 setdefault 方法,可以用来保存和删除某些临时信息。
请求上下文
请求上下文对象有两个,分别是:
- request 对象:请求对象,封装了客户端发出的HTTP请求
- method:请求类型,如 GET、POST 等
- form:POST 请求数据,dict类型
- args:GET 请求的数据,dict类型
- values:POST 请求和 GET 请求数据集合,dict类型
- files:上传文件的数据,dict 类型
- cookies:请求中存储的 cookie,dict 类型
- headers:HTTP 请求头
- sessio 对象:用户会话,是一个字典类型,存储在服务端,请求之间数据共享
新增视图函数 get_params,获取 get 请求中的参数
from flask import request
@app.route("/params")
def get_params():
params = request.args
print('请求中传入的参数为:{}'.format(params))
print('传入参数的格式为:{}'.format(type(params)))
print('是否是一个字典类型:{}'.format(isinstance(params, dict)))
print('params中name的值为:{}'.format(params.get('name')))
print('params中address的值为:{}'.format(params.get('address')))
return "SUCCESS"
重启应用,在浏览器输入 http://127.0.0.1:5000/params?name=stark&address=NY
当请求传递参数为空时,输出为 None,也可以给没有传值的参数设置默认值,在 get_params 视图函数中增加代码
nickname = request.args.get('nickname', 'IronMan')
print('params中nickname的值为:{}'.format(nickname))
新增视图函数 get_headers,解析请求头中的IP地址
@app.route('/headers')
def get_headers():
# 获取请求头中的Host
headers = request.headers
print("获取到的请求头为:{}".format(headers))
print('请求头的数据类型为:{}'.format(type(headers)))
host = request.host
print('请求中的host为:{}'.format(host))
print('请求中的host的数据类型为为:{}'.format(type(host)))
host_url = request.host_url
print('请求中的host_url为:{}'.format(host_url))
# 获取远程IP地址
remote_addr = request.remote_addr
print('请求的远程IP地址为:{}'.format(remote_addr))
# 获取代理
user_agent = request.user_agent
print('请求代理为:{}'.format(user_agent))
return 'SUCCESS'
请求钩子函数
请求钩子函数可以对请求进行鉴权或者限制某些 IP 的恶意请求:
- before_first_request,在服务器初始化后第一个请求到达前执行,只会执行一次
- before_request,每一个请求到达前执行
- after_request,每次请求处理完成之后执行,如果请求中出现了异常,则不执行
- teardown_request,每次请求处理完之后执行,如果请求过程中出现了异常,也能执行
- errorhandler,对异常进行处理,当视图函数中中抛出了错误, 并且错误码能够匹配上注册的
errorhandler
的错误码时会被触发
新增四个视图函数
@app.before_first_request
def first_request():
'''服务器启动后第一个请求到达'''
print('服务器启动后的第一个请求')
@app.before_request
def before_request():
print('每个请求处理前都会运行的方法')
重启服务后,浏览器输入 http://127.0.0.1:5000/params?name=stark&address=NY
清除控制台的日志,再次请求。
after_request 和 teardown_request 两个钩子函数必须包含一个 response 作为参数,after_request 必须返回 response,teardown_request 则不要求,因为这两个参数是请求处理完之后执行,可以对请求响应做一些处理后返回给用户,如对异常或者报错进行封装处理。
再增加两个视图函数
@app.after_request
def after_request(response):
print(response.headers)
print('每个请求处理后都会运行的方法,有异常不执行')
return response
@app.teardown_request
def teardown_request(response):
print('每个请求处理前都后运行的方法,有异常也会执行')
return response
重启服务,浏览器输入 http://127.0.0.1:5000/params?name=stark&address=NY
相关文章
- Python 编程 | 连载 20 - 文件 I/O
- 常用Python库_编程代码大全
- Python基础21-网络编程
- Python 编程 | 连载 17 - 高阶函数与装饰器
- Python 编程 | 连载 10 - 字典及操作
- Python 编程 | 连载 09 - 列表、元组和字符串切片
- Python 编程 | 连载 06 - 格式化与转义字符
- Python升级之路( Lv14 ) 并发编程初识
- Python Flask 编程 | 连载 09 - Jinja2 模板特性
- Python 编程 | 连载 08 - 列表与元组操作
- Python Flask 编程 | 连载 03 - Flask 请求
- vb编程入门_python编程入门
- Python 编程骚操作连载(一)- 字符串、列表、字典和集合的处理(Part A)
- Python 编程 | 连载 05 - 字符串操作
- python滑动验证码_python编程是啥
- Python 编程 | 连载 13 - Python 的流程控制
- Python 编程 | 连载 26 - Python 多线程
- Python Flask 编程 | 连载 06 - Jinja2 语法
- Python 编程 | 连载 14 - Python 的函数
- Python 编程骚操作连载(二)- 类与对象