flask框架学习(4)-处理请求
1.获取json格式的请求体
2.获取表单格式的请求体
3.获取请求中的查询参数
4.文件保存
5.URL路径参数(动态路由)
6.其它的参数属性
7.前置/后置处理器(请求钩子)
1.获取json格式的请求体
# 即 Content-Type:application/json
import json
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=["post"])
def deal_request():
# 数据的格式为bytes,加入了as_test=True参数后就变成Unicode
# 此时data是字典格式,然后可以通过字典的key去获取对应的value
data = json.loads(request.get_data(as_text=True))
# 也可以用下面这种写法
# data =json.loads(request.data)
print(data)
return "ok"
if __name__ == '__main__':
app.run()
# data的结果 :{'name': 'abc', 'age': 18}
2.获取表单格式的请求体
# 如果是文件上传,一般Content-Type设置为multipart/form-data
# 如果普通表单提交,一般Content-Type设置为application/x-www-form-urlencoded
# 都可以使用request.form去获取值
# -*-coding:utf-8-*-
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=["post"])
def deal_request():
# 此时data是字典格式,然后可以通过字典的key去获取对应的value
data = request.form
print(data)
print(data["name"])
return "ok"
if __name__ == '__main__':
app.run(debug=True)
# data的结果 ImmutableMultiDict([('name', 'abc'), ('age', '18')])
# data["name"] 的结果 abc
3.获取请求中的查询参数
# -*-coding:utf-8-*-
from flask import Flask, request
app = Flask(__name__)
@app.route('/api', methods=["get"])
def deal_request():
# 此时data是字典格式,然后可以通过字典的key去获取对应的value
data = request.args
print(data)
print(data["page"])
return "ok"
if __name__ == '__main__':
app.run(debug=True)
# data的结果 ImmutableMultiDict([('page', '1'), ('num', '10')])
# data["page"] 的结果 1
4.文件保存
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=["post"])
def deal_request():
files = request.files["files"]
print(files)
# 获取文件名
print(files.filename)
# 设置保存位置
files.save("./" + files.filename)
return "ok"
if __name__ == '__main__':
app.run(debug=True)
# files结果: <FileStorage: '1.txt' ('text/plain')>
# files.filename 1.txt
5.URL路径参数(动态路由)
eg: 有一个请求访问的接口地址为/detail/100,其中100实际上为具体的请求参数,
请求文章详情页id为100的文章。此时如何从url中提取出100?
@app.route('/detail/<detail_id>',methods=["get"])
def detail_info(detail_id):
print(detail_id)
return "ok"
此处的<>即是一个转换器,默认为字符串类型,即将该位置的数据以字符串格式进行匹配、
并以字符串为数据类型类型、 udetail_id为参数名传入视图。
6.其它的参数属性
7.前置/后置处理器(请求钩子)
为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
1.before_first_request
在处理第一个请求前执行
2.before_request
在每次请求前执行
如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
3.after_request
如果没有抛出错误,在每次请求后执行
接受一个参数:视图函数作出的响应
在此函数中可以对响应值在返回之前做最后一步修改处理
需要将参数中的响应在此参数中进行返回
4.teardown_request:
在每次请求后执行
接受一个参数:错误信息,如果有相关错误抛出
# 示例:
# -*- encoding: utf-8 -*-
from flask import Flask, make_response, abort, jsonify, request
# Flask类接收一个参数__name__
app = Flask(__name__)
@app.before_request
def before_request():
"每次请求前执行的函数"
# 获取请求的url
print(request.url)
# 获取请求头的值
print(request.headers.get("User-Agent"))
# 进去鉴权
if request.headers.get("permission") is None:
"""
使用abort抛出异常,程序不会继续往下执行
使用make_response + jsonify 返回 json格式的数据,否则将返回html格式的数据
"""
error_message = {"result": "warn", "info": "无权限访问"}
response = make_response(jsonify(error_message), 403)
response.headers['Content-Type'] = 'application/json'
abort(response)
# 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'Hello World'
@app.after_request
def after_request(response):
"""每次请求后执行的函数"""
print("每次请求结束后执行的函数")
# 需要把响应return出去,不然会报错
return response
# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
文章标题:flask框架学习(4)-处理请求
本文作者:伟生
发布时间:2022-10-01, 21:03:00
最后更新:2024-01-14, 16:58:24
原始链接:http://yoursite.com/2022/10/01/flask_10_deal_request/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。