Flask框架的请求与响应
Flask的请求
- flask的请求数据通过 request 对象来获取
- 常用属性:
代码示例:
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)
Flask的响应
1.访问静态资源
- 将静态资源放入到 项目的 static 文件夹中
- 通过内置的静态资源的访问路由, URL路径格式为 /static/,例如 static目录放入文件 123.jpg, 则访问URL为 http://127.0.0.1:5000/static/123.jpg
Flask对象的初始化参数 也可以 修改静态资源的存储和访问路径
示例代码:
from flask import Flask
app = 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 Flask
app = 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, Response
app = Flask(__name__)
# 自定义响应对象
@app.route('/demo2')
def demo2():
# 视图函数的返回值可以为str/bytes类型, 并且flask内部会将其包装为Response响应对象
# return 'hello flask'
# 创建响应对象 设置响应头时,需要手动创建响应对象
response = make_response('hello flask') # type: Response
# 设置响应头
response.headers['B'] = 10
return response
if __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, jsonify
app = 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, redirect
app = Flask(__name__)
@app.route('/demo4')
def demo4():
# 重定向到指定网站
# return redirect('http://www.baidu.com')
# 重定向到自己的路由 只需要URL资源段
return redirect('/demo3')
if __name__ == '__main__':
app.run(debug=True)