请求与响应 - 处理响应信息
针对于后端服务,需要针对请求返回对应的响应信息。
响应信息可以响应很多类型的信息类型。常见的比如文本类型,还有非常通用的 JSON 数据。
在 Flask 中,可以使用视图函数来处理接口请求并生成相应的响应。而且 Flask 提供了多种方式来构建和返回接口响应。
接口响应常见类型
- 文本型
- 元组
- JSON
- HTML
- 额外数据
返回文本类型
首先来看最简单的类型,返回一个文本数据。
比如现在编写一个接口,设定路由为 /text
,请求方法为默认的 GET 请求。返回一串文本信息。
from flask import Flask
# 创建 Flask 应用程序实例
app = Flask(__name__)
# 定义路由和视图函数
@app.route('/text')
def text_res():
return '返回文本'
# 运行应用程序
if __name__ == '__main__':
app.run()
示例中,视图函数 text_res()
直接返回一个字符串 '返回文本'
,Flask 将自动将其封装成一个纯文本响应并发送给客户端。打开浏览器,就可以看到接口返回的文本内容。
此外,打开浏览器开发者工具 Network 面板查看这个接口,可以注意到 Response Headers
中的Content-Type
是 text/html; charset=utf-8
。
返回元组类型
除了文本,接口还可以返回元组格式。
元组格式包含 3 个参数类型。第一个是 response 对象,第二个是响应状态码,第三个是响应头信息。也可以只填写 2 个返回信息。比如 (response, status)
结合,还有 (response, headers)
结合。
例如:如果 3 个返回数据都添加响应信息。
from flask import Flask
# 创建 Flask 应用程序实例
app = Flask(__name__)
@app.route('/tuple')
def tuple_res():
return "你好呀", 200, {"hogwarts": "Harry"}
# 运行应用程序
if __name__ == '__main__':
app.run()
可以看到响应状态码为 200,响应头信息中包含了 Hogwarts 这个字段。
返回 JSON
在前后端分离开发的实践中,后端提供的接口响应信息基本都为通用的 JSON 格式。
返回 JSON 类型的响应数据有两种方法。
- 第一种是使用
jsonify()
方法,此方法支持,直接传入一个字典,也支持通过关键字参数传递。
# 返回json
from flask import Flask, jsonify
# 创建 Flask 应用程序实例
app = Flask(__name__)
@app.route('/json')
def get_json():
# jsonify({'status': 0})
return jsonify(status=1, name="lily", age=20)
# 运行应用程序
if __name__ == '__main__':
app.run()
- 第二种方法就是直接返回字典,在 Flask 1.1 版本之后,直接返回 python 的字典类型时,Flask 会调用
jsonify()
方法。
# 返回字典
from flask import Flask
# 创建 Flask 应用程序实例
app = Flask(__name__)
# 定义路由和视图函数
@app.route('/dict')
def get_dict():
return {'status': 0}
# 运行应用程序
if __name__ == '__main__':
app.run()
以上 /json
和 /dict
路由的响应信息的 Content-Type
均为 application/json
。
返回 HTML
接口还可以直接返回 HTML。返回 HTML 主要使用的是模板渲染技术。
from flask import Flask, render_template
# 创建 Flask 应用程序实例
app = Flask(__name__)
@app.route('/html')
def get_html():
# 调用render_template方法,传入html 文件的名称。
# 注意html文件必须在 templates 目录下
return render_template('demo.html')
# 运行应用程序
if __name__ == '__main__':
app.run()
可以在 templates 目录下新建 demo.html 文件。
<!--
html文件必须在templates目录下
/application.py
/templates
/demo.html
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Hogwarts</title>
</head>
<body>
<h1>测试开发</h1>
</body>
</html>
浏览器中访问 /html
路由,发现页面中展示了 测试开发
。
返回额外数据
在构造响应的过程中,除了构造响应体,响应头,响应状态码等,可能还要添加其他的响应信息。比如需要添加 cookie,则可以使用 make_response()
方法。
返回额外数据
在构造响应的过程中,除了构造响应体,响应头,响应状态码等,可能还要添加其他的响应信息。比如需要添加 cookie,则可以使用 make_response()
方法。
from flask import Flask, render_template, make_response
# 创建 Flask 应用程序实例
app = Flask(__name__)
# 定义路由和视图函数
@app.route('/')
def index():
resp = make_response(render_template('demo.html'))
# 设置cookie
resp.set_cookie('username', 'the username')
# 设置响应头信息
resp.headers["hogwarts"] = "Hary"
return resp
# 运行应用程序
if __name__ == '__main__':
app.run()
浏览器中访问 http://127.0.0.1:5000
路由,发现页面中展示 霍格沃兹测试开发
。且响应头信息中包含 Hogwarts 字段,值为 Hary。Set-Cookie 中包含设置的 Cookie 信息。