请求与响应 - 处理响应信息
大家好,今天我们要讨论的是如何处理 响应信息,也就是当客户端发出请求之后,后端服务器如何构建和返回数据。你可以把这个过程想象成:客户端向服务器提出问题,服务器在获取到请求数据后,进行处理,最后把结果反馈给客户端。这些反馈的结果就是 响应信息。这些响应信息的类型有很多种,可以是文本、JSON、HTML,甚至是一些额外的状态信息。今天,我们会介绍如何在 Flask 中返回这些不同类型的响应。
简介
针对于后端服务,需要针对请求返回对应的响应信息。
响应信息可以响应很多类型的信息类型。常见的比如文本类型,还有非常通用的 JSON 数据。
在 Flask 中,可以使用视图函数来处理接口请求并生成相应的响应。而且 Flask 提供了多种方式来构建和返回接口响应。
Flask 作为一个轻量级的 web 框架,提供了多种方式来处理请求并返回响应。在后端开发中,我们通常会根据请求的内容类型和业务需求,返回不同格式的数据。最常见的响应类型包括文本、JSON、HTML,甚至有时候会涉及到一些额外的数据,比如 Cookie 信息。接下来,我们会介绍 Flask 中一些常见的响应类型以及如何返回这些数据。
接口响应常见类型
- 文本型
- 元组
- JSON
- HTML
- 额外数据
在 Flask 中,我们可以返回几种常见类型的数据。文本型:简单的文本响应,通常用于返回纯文本数据。元组:你可以返回一个元组,其中包含响应内容、状态码和响应头信息。JSON:在前后端分离的应用中,JSON 是最常见的响应格式,方便前端处理。HTML:如果你需要渲染网页,可以返回 HTML 内容。额外数据:除了响应内容,还可以返回一些额外的数据,比如设置 cookies 或者自定义头信息。
返回文本类型
首先来看最简单的类型,返回一个文本数据。
比如现在编写一个接口,设定路由为 /text
,请求方法为默认的 GET 请求。返回一串文本信息。
from flask import Flask
# 创建 Flask 应用程序实例
app = Flask(__name__)
# 定义路由和视图函数
@app.route('/text')
def text_res():
return '返回文本'
# 运行应用程序
if __name__ == '__main__':
app.run()
首先,让我们看一个最简单的例子:返回文本类型的响应。当客户端访问接口时,服务器直接返回一串文本信息。在这个例子中,我们创建了一个简单的 Flask 应用,定义了一个路由 /text,并返回了一段文本 '返回文本'。Flask 会自动将返回的字符串封装为一个文本响应,并设置 Content-Type 为 text/html。
示例中,视图函数 text_res()
直接返回一个字符串 '返回文本'
,Flask 将自动将其封装成一个纯文本响应并发送给客户端。打开浏览器,就可以看到接口返回的文本内容。
此外,打开浏览器开发者工具 Network 面板查看这个接口,可以注意到 Response Headers
中的Content-Type
是 text/html; charset=utf-8
。
当你访问这个接口时,你会看到浏览器展示了 '返回文本'。在开发者工具中查看响应头,你会注意到它的 Content-Type 是 text/html,这表示服务器返回的是一个简单的文本内容。
返回元组类型
除了文本,接口还可以返回元组格式。
元组格式包含 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 字段的响应头。
可以看到响应状态码为 200,响应头信息中包含了 Hogwarts 这个字段。
当你访问这个接口时,响应头中会包含自定义的 hogwarts 字段,并且状态码为 200,这表示请求成功。
返回 JSON
在前后端分离开发的实践中,后端提供的接口响应信息基本都为通用的 JSON 格式。
返回 JSON 类型的响应数据有两种方法。
在前后端分离的应用中,JSON 格式的响应数据是非常常见的,尤其是在 API 接口中。Flask 提供了非常简单的方式来返回 JSON 格式的数据。有两种常见的方式来返回 JSON 数据。第一种方式是使用 jsonify() 方法,第二种方式是在 Flask 1.1 版本之后,直接返回 Python 字典,Flask 会自动将其转换为 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()
先来看第一种,使用 jsonify 方法,它可以既可以接受一个字典作为参数,也支持通过关键字参数传递。然后把它们转换为 JSON 格式的响应。在这个例子中,我们在 jsonify 方法中使用关键字传参的方式传入了三个参数。启动服务之后,我们访问 /json 路由就可以看到响应的内容是 JSON 格式的数据。
- 第二种方法就是直接返回字典,在 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()
第二种方法:直接返回字典,Flask 会自动调用 jsonify() 来处理。在这个例子中,我们在 get_dict 视图函数中直接 return 了一个字典。
以上 /json
和 /dict
路由的响应信息的 Content-Type
均为 application/json
。
启动服务,来访问一下上面这两个路由。可以看到无论是 /json 还是 /dict,返回的响应内容都会被自动设置为 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()
有时候,我们需要返回 HTML 页面,而不是简单的文本或 JSON 数据。在这种情况下,Flask 提供了模板渲染功能,允许我们渲染 HTML 文件并返回给客户端。在下面这个例子中,我们通过 render_template() 函数渲染一个 HTML 文件,并将其作为响应返回。注意,HTML 文件需要放在 Flask 项目的 templates 目录下。
可以在 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>
在 templates 目录下,我们可以创建一个简单的 demo点html 文件,其中包含一些基本的 HTML 结构。具体的 HTML 语法我们会在前端开发的章节中再详细给大家做介绍。
浏览器中访问 /html
路由,发现页面中展示了 霍格沃兹测试开发
。
启动服务,当我们访问 /html 路由时,浏览器会渲染并展示霍格沃兹测试开发页面内容。
返回额外数据
在构造响应的过程中,除了构造响应体,响应头,响应状态码等,可能还要添加其他的响应信息。比如需要添加 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()
除了响应体和状态码,Flask 还允许我们在响应中添加一些额外的数据,比如设置 Cookies 或自定义的头信息。要实现这一点,我们可以使用 make response 方法。make_response 是 Flask 中提供的一个辅助函数,用于创建一个响应对象。它的主要作用是把视图函数的返回值转换为响应对象。可以传递一个数据内容比如字符串、JSON 或 HTML给 make_response,然后它会返回一个 Response 对象。然后我们再通过这个响应对象来设置响应的内容、状态码和头信息。比如在这个例子中,我们传入了一个 html 模版给 make_response 方法,获得了 resp 这个响应对象。然后通过 resp 设置了 cooke 和响应头信息。
浏览器中访问 http://127.0.0.1:5000
路由,发现页面中展示 霍格沃兹测试开发
。且响应头信息中包含 Hogwarts 字段,值为 Hary。Set-Cookie 中包含设置的 Cookie 信息。
启动服务,我们在浏览器中访问一下根路由。可以看到不仅渲染了 demo.html,还设置了一个名为 username 的 Cookie,并在响应头中添加了 hogwarts 字段。
总结
- 返回文本类型
- 返回元组类型
- 返回 JSON
- 返回 HTML
- 返回额外数据
最后来总结一下。这个章节我们介绍了 Flask 中处理响应的不同方式。这些方法让你在开发过程中能够根据不同的需求,灵活地构造和返回响应信息。