实战Flask API项目指南之 请求和响应处理
本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握 Flask
在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧!
前言
当小菜踏入Flask
后端开发的世界时,处理请求(Request)和生成响应(Response)是非常关键的部分。
这些请求和响应是后端平台与用户或其他应用程序之间交互的主要方式。下面让我们来深入了解 Flask
中的请求与响应。
注意:本文叙述的比较详细(即比较啰嗦),但都是干货
请求和响应处理
在 Flask
应用中,处理客户端的请求并返回适当的响应是构建Web应用的核心。Flask提供了丰富的工具和机制,使得请求的处理和响应的生成变得高效和灵活。
1. 请求
1.1 HTTP请求方法
所以在前面所有的代码示例中,我们都是通过 GET 方法来访问。
我们没有指定
methods
参数,因为视图函数默认响应GET请求。
在我们有其他HTTP方法的需求时候,可以通过指定methods
参数来处理其他HTTP方法。Flask
支持常见的HTTP请求方法,如GET、POST、PUT、DELETE等。
以下是这些HTTP请求方法及其用途的简要描述:
HTTP方法 | 用途 |
---|---|
GET | 从服务器获取资源,通常用于请求数据的读取。 |
POST | 向服务器提交数据,通常用于创建新资源或进行数据的更新。 |
PUT | 向服务器提交数据,通常用于更新现有资源,完全替代原始数据。 |
DELETE | 请求服务器删除指定资源。 |
PATCH | 部分更新服务器上的资源,通常用于更新资源的一部分。 |
HEAD | 请求服务器仅返回HTTP头部信息,不包含实际内容,用于检查资源的元数据。 |
OPTIONS | 请求服务器提供有关支持的通信选项的信息,通常用于跨域请求。 |
TRACE | 请求服务器将请求返回给客户端,通常用于诊断和调试目的。 |
因为默认的是 GET请求,所以这里设置为 POST请求
from flask import Flask
app = Flask(__name__)
@app.route("/submit", methods=["POST"])
def submit():
return "Your request method is POST!"
if __name__ == "__main__":
app.run()
在这个例子中,我们定义了 “/submit” 路由,它能够响应POST请求。视图函数将返回 “Your request method is POST!”
因为这里的submit是一个POST请求,这个时候使用GET请求方法的话,Flask
将会抛出 404 错误(Not Found)。这意味着 Flask
无法找到匹配的路由规则,因为请求方法不符合要求。
访问效果如下图所示:
多个HTTP请求方法
在开发中,常用的HTTP方法是GET、POST,这里使用这两种方法做展示。
from flask import Flask, request
app = Flask(__name__)
@app.route("/submit", methods=["GET", "POST"])
def submit():
if request.method == "POST":
return "Your request method is POST!"
return "Your request method is GET!"
if __name__ == "__main__":
app.run()
在这个例子中,我们定义了 “/submit” 路由,它能够响应GET和POST请求。
- 如果用户使用GET请求,否则返回 “Your request method is GET!”
- 如果用户使用POST请求,视图函数将返回 “Your request method is POST!”
访问效果如下图所示:
1.2 请求对象request
Flask
的request
对象是一个全局对象,可以在视图函数中直接访问。它包含了关于当前请求的所有信息,包括URL参数、表单数据、请求方法等。
以下是一些常用的request
对象方法和属性:
方法/属性 | 描述 |
---|---|
request.method | 获取HTTP请求的方法,如GET、POST、PUT等。 |
request.args | 获取包含URL查询参数的字典。 |
request.form | 获取包含表单数据的字典(通常用于POST请求)。 |
request.values | 获取包含查询参数和表单数据的字典。 |
request.headers | 获取HTTP请求的头部信息,返回一个字典。 |
request.cookies | 获取请求中的Cookie数据,返回一个字典。 |
request.get(key, default) | 获取查询参数或表单数据中的指定键的值,可指定默认值。 |
request.files | 获取上传的文件,返回一个字典,每个文件表示为一个FileStorage 对象。 |
request.data | 获取HTTP请求的原始数据,通常用于读取请求体中的数据。 |
request.json | 尝试解析请求体中的JSON数据并返回解析后的Python对象。 |
request.remote_addr | 获取客户端的IP地址。 |
request.user_agent | 获取客户端的User-Agent字符串。 |
使用几个简单的示例来展示:
读取请求参数
- URL参数是通过URL的查询字符串传递的数据,通常出现在问号后面,例如
http://127.0.0.1:5000/?name=frica01
。可以使用request.args
字典来获取这些参数。
from flask import Flask, request
app = Flask(__name__)
@app.route("/")
def user():
name = request.args.get("name", "frica01")
return f"Hello, {name}!"
if __name__ == "__main__":
app.run()
在上面的示例中,我们使用request.args.get()
方法获取名为name
的查询参数,如果参数不存在,则默认为frica01
。
读取请求数据
- 在POST请求中发送JSON数据时候,使用
request.data
来获取请求的原始数据。
from flask import Flask, request
app = Flask(__name__)
@app.route("/json", methods=["POST"])
def json_data():
data = request.data
return f"Received JSON data: {data.decode()}"
if __name__ == "__main__":
app.run()
读取表单
- 使用
request.form
字典来表单数据。
from flask import Flask, request
app = Flask(__name__)
@app.route("/example", methods=["POST"])
def example():
# 获取表单数据
username = request.form.get("username")
password = request.form.get("password")
return f"Received POST request with username: {username}, password: {password}"
if __name__ == "__main__":
app.run()
在上面的示例中,我们使用了 request.method
来检查请求的 HTTP 方法,并使用 request.form
获取表单数据。
1.3 请求头
HTTP 请求通常包含一些元数据,称为请求头。这些头部信息包含了关于请求的额外信息,例如用户代理、内容类型等。你可以使用 request.headers
来访问请求头。
当涉及到请求头时,以下是常见的一些请求头以及它们的含义,整理成表格如下:
请求头 | 含义 |
---|---|
User-Agent | 请求的用户代理标识,通常包含了客户端应用程序的信息,可以用于识别客户端类型。 |
Content-Type | 请求正文的媒体类型,指定了请求中包含的数据的类型,例如 application/json 表示请求包含 JSON 数据。 |
Authorization | 包含了用于身份验证的凭据,通常用于访问受保护的资源。 |
Cookie | 包含了客户端传递给服务器的 cookie 信息,用于会话管理等。 |
Accept | 指定了客户端可以接受的响应内容类型,服务器可以根据这个头部来返回适当的内容。 |
Referer | 包含了引导用户到当前页面的来源页面的 URL。 |
这里延伸一下,
Flask
代码如下所示:
from flask import Flask, request
app = Flask(__name__)
@app.route("/book")
def profile():
user_agent = request.headers.get("User-Agent")
print(user_agent)
return f"Hello, fric01!"
if __name__ == "__main__":
app.run()
请求代码如下:
import requests
resp = requests.get('http://127.0.0.1:5000/book')
print(resp)
访问效果如下图所示:
从安全性来考虑的话,可以判断 user-agent 中带有 python 字符串的,都不给返回数据。
2. 响应
当 Flask
应用程序处理完请求后,它需要生成一个响应并将其发送回客户端。响应通常包含 HTTP 状态码、响应头和响应正文。
在使用 Flask
实现API接口的后端平台时候,我们关心的只有 HTTP 状态码 和响应正文,下面来介绍他们。
2.1 响应正文
响应正文是要发送回客户端的实际数据。它可以是 HTML、JSON、文本等不同类型的数据。你可以将数据直接包含在 make_response
函数中,也可以使用 jsonify
函数将 Python 数据转换为 JSON 格式。(注:这里不对make_response
做介绍)
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "Hello, World!"
在这个例子中,视图函数返回的字符串 “Hello, World!” 将会作为响应的主体发送给客户端。
2.2 设置状态码
当涉及到 HTTP 状态码时,以下是常见的一些状态码以及它们的含义:
状态码 | 含义 |
---|---|
1xx | 相关信息 |
2xx | 操作成功 |
3xx | 重定向 |
4xx | 客户端错误 |
5xx | 服务器错误 |
这些是一些常见的 HTTP 状态码,服务器通常使用这些状态码来指示请求的处理结果,以便客户端能够根据状态码采取适当的操作。
在生成响应时,可以通过第二个返回值来设置状态码。
from flask import Flask
app = Flask(__name__)
@app.route("/not_found")
def not_found():
return "Resource not found", 404
在这个例子中,视图函数返回的字符串 “Resource not found” 将会作为响应的主体发送给客户端,并设置状态码为404。
2.3 返回值类型
Flask
支持多种不同类型的视图函数返回值,每种类型都对应不同的响应内容和HTTP状态码。
以下是一些常见的Flask
视图函数返回值类型以及它们的特点:
返回值类型 | 描述 |
---|---|
字符串 | 返回一个字符串,作为HTTP响应的正文内容发送给客户端。 |
元组 | 返回一个包含响应体、HTTP状态码和响应头的元组,可用于更精确地控制响应的各个方面。 |
Response对象 | 使用Flask提供的Response 对象,可以更灵活地设置响应的属性,包括响应体、HTTP状态码、响应头等。 |
JSON数据 | 使用jsonify 函数将Python字典转换为JSON格式,并返回作为HTTP响应的正文内容,适用于构建API。 |
重定向响应 | 返回一个重定向响应,将客户端重定向到另一个URL,可用于在应用内导航或重定向到外部网站。 |
在使用Flask
实现API接口的后端平台时候,常用的返回值类型主要包括元组和JSON数据。以下是如何使用这两种返回值类型的示例代码:
返回元组
from flask import Flask
app = Flask(__name__)
@app.route("/tuple")
def return_tuple():
response_body = "This is a tuple response"
status_code = 200
return response_body, status_code
if __name__ == '__main__':
app.run()
在这个示例中,我们定义了一个视图函数 return_tuple()
,它返回一个包含响应体、HTTP状态码的元组。
但在请求的返回值中,通常只能访问到响应体,而不会直接看到状态码。
返回JSON数据
Flask
提供了jsonify
函数,可以将Python字典转换为JSON格式并返回。
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/api/data")
def api_data():
data = {"name": "John", "age": 30}
return jsonify(data)
if __name__ == "__main__":
app.run()
在上面的示例中,我们使用jsonify
函数将一个字典转换为JSON格式,并返回作为HTTP响应的正文内容。这对于构建API非常有用。
访问效果如下图所示:
总结
本文深入介绍了在 Flask
应用中处理客户端请求和生成适当的响应的关键概念。主要内容包括请求处理方法(如GET和POST)、请求对象request的使用、常见请求头信息、响应正文的生成(包括JSON数据)、状态码的设置,以及不同类型的返回值。
通过深入了解 Flask
中的请求和响应处理,小菜已经具备了处理不同类型请求数据并生成对应响应的能力。