05.请求与响应 处理响应信息

发布时间 2023-11-19 17:50:33作者: 想要暴富的小男孩

请求与响应 - 处理响应信息

针对于后端服务,需要针对请求返回对应的响应信息。

响应信息可以响应很多类型的信息类型。常见的比如文本类型,还有非常通用的 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 类型的响应数据有两种方法。

  1. 第一种是使用 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()

  1. 第二种方法就是直接返回字典,在 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 信息。