Flask框架的请求与响应
Flask的请求
- flask的请求数据通过 request 对象来获取
- 常用属性:

代码示例: ```python from flask import Flask, request from werkzeug.datastructures import FileStorage
app = Flask(name)
@app.route(‘/‘, methods=[‘get’, ‘post’]) def index():
# 获取请求的基础数据# print(request.url) # 请求的URL# print(request.method) # 本次请求的请求方式# print(request.headers) # 获取请求头信息 类字典对象# print(request.headers['Host'])# print(request.headers.get('Host')) # 建议使用get方法, 键不存在不报错# 请求传递数据 1> URL路径 -> 路由变量 2> 查询字符串 get 3> 请求体 post 4> 请求头 -> request.headers# 获取查询字符串 -> request.args xx?name=zs&age=20 类字典对象# print(request.args.get('name'))# print(request.args.get('age'))# 请求体: 键值对(表单) 文本(json/xml) 文件(图片/音频)# 获取post键值对 -> request.form 类字典对象# print(request.form.get('username'))# 获取post文本数据 -> request.data / request.json# print(request.data) # 返回bytes类型# print(request.json.get('age')) # request.json直接将json字符串转为字典# 获取post文件 -> request.files 类字典对象file = request.files.get("avatar") # type: FileStorage# print(type(file)) # 返回 FileStorage文件对象# 将文件保存到本地file.save('123.jpg')# 获取文件的二进制数据# img_bytes = file.read()# print(img_bytes)return "index"
if name == ‘main‘: app.run(debug=True)
<a name="d9303819"></a>### Flask的响应1.访问静态资源将静态资源放入到 项目的 static 文件夹中<br />通过内置的静态资源的访问路由, URL路径格式为 /static/,例如 static目录放入文件 123.jpg, 则访问URL为 [http://127.0.0.1:5000/static/123.jpg](http://127.0.0.1:5000/static/123.jpg)<br />Flask对象的初始化参数 也可以 修改静态资源的存储和访问路径示例代码:```pythonfrom flask import Flaskapp = Flask(__name__, # 导入名称, flask会根据该参数查询静态文件的存储路径# 官方建议直接使用__name__, 表示从当前目录中查询静态文件存储路径static_folder="static1", # 设置静态文件的存储目录static_url_path='/res/img', # 设置静态文件的URL访问路径 如 127.0.0.1:5000/res/img/123.jpg)if __name__ == '__main__':app.run(debug=True)
2.设置响应数据
Flask中设置响应数据主要有两种方式:
- 设置多个返回值
- 自定义响应对象
2.1 三个返回值
Flask中 视图函数的返回值可以设置三个, 分别对应响应体, 响应状态码, 响应头
from flask import Flaskapp = Flask(__name__)@app.route('/demo1')def demo1():# 返回值: 响应体, 响应状态码, 响应头return 'demo1', 400, {'A': 40}if __name__ == '__main__':app.run(debug=True)
2.2 自定义响应对象
- 视图函数返回的 str / bytes 类型数据会被包装为 Response 响应对象, 也可以 创建响应对象来 自定义响应头 等信息
from flask import Flask, make_response, Responseapp = Flask(__name__)# 自定义响应对象@app.route('/demo2')def demo2():# 视图函数的返回值可以为str/bytes类型, 并且flask内部会将其包装为Response响应对象# return 'hello flask'# 创建响应对象 设置响应头时,需要手动创建响应对象response = make_response('hello flask') # type: Response# 设置响应头response.headers['B'] = 10return responseif __name__ == '__main__':app.run(debug=True)
3.返回JSON
如果接口需要返回 JSON 数据,在 Flask 中可以直接使用 jsonify() 生成一个 JSON 的响应
不推荐使用 json.dumps() 直接返回,因为返回的数据要符合 HTTP 协议规范,如果是 JSON 需要指定 content-type:application/json
from flask import Flask, make_response, Response, jsonifyapp = Flask(__name__)@app.route('/demo3')def demo3():dict1 = {'name': 'zs', 'age': 20}# 字典转json字符串# return json.dumps(dict1)# 可以将字典转json字符串, 并且设置响应头的content-type为application/json# return jsonify(dict1)return jsonify(name='zs', age=20) # 也支持关键字实参的形式if __name__ == '__main__':app.run(debug=True)
4.重定向
- flask中通过 redirect() 实现重定向功能
from flask import Flask, redirectapp = Flask(__name__)@app.route('/demo4')def demo4():# 重定向到指定网站# return redirect('http://www.baidu.com')# 重定向到自己的路由 只需要URL资源段return redirect('/demo3')if __name__ == '__main__':app.run(debug=True)
