【实战Flask API项目指南】之四 请求和响应处理

举报
frica01 发表于 2023/09/30 23:56:05 2023/09/30
【摘要】 关于使用flask搭建后端api平台的一些操作,超干货!!!

实战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

Flaskrequest对象是一个全局对象,可以在视图函数中直接访问。它包含了关于当前请求的所有信息,包括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 中的请求和响应处理,小菜已经具备了处理不同类型请求数据并生成对应响应的能力。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。