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

news2024/11/28 6:45:12

实战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 中的请求和响应处理,小菜已经具备了处理不同类型请求数据并生成对应响应的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1172582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实证论文复刻|stata安慰剂检验

文章及代码来源:中国工业经济《税收征管数字化与企业内部薪酬差距》 目录 随机抽取对照组和实验组 随机设定政策时点 先po完整代码 *随机抽取对照组和控制组 forvalue i1/500{sysuse 数据1.dta, clear g obs_id _n //初始样本序号gen random_digit runiform() /…

读程序员的制胜技笔记04_有用的反模式(下)

1. 重新发明轮子 1.1. 发明家的特质就是要用质疑的心态对待所有事物,你从未停下质疑,那你将不可避免地成为一个发明家 1.2. 并非所有的事情都有现成的轮子可以拿来用 1.3. 自己重新写一个新的API,最终调用你使用的库 1.3.1. 你的API应该是…

C++二分查找算法的应用:最小好进制

本文涉及的基础知识点 二分查找 题目 以字符串的形式给出 n , 以字符串的形式返回 n 的最小 好进制 。 如果 n 的 k(k>2) 进制数的所有数位全为1,则称 k(k>2) 是 n 的一个 好进制 。 示例 1: 输入:n “13” 输出:“3” …

Canvas制作喷泉效果示例

Canvas能制作出很多动画效果&#xff0c;下面是一个制作喷泉效果的示例 效果图 源代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, initial-scale1 ,user-…

Kubernetes技术与架构-存储 3

如上所示&#xff0c;Kubernetes集群的存储层支持不同类型的存储资源&#xff0c;其提供Projected类型的存储功能整合多种存储资源&#xff0c;将secret、downwardAPI、configMap三种不同类型的存储资源整合成一个挂载到Pod的容器实例中 如上所示&#xff0c;整合两个secret类型…

给跪!我居然被封了!

起因 前两天不知道什么情况&#xff0c;突然收到一条违规信息&#xff0c;说我营销过度&#xff1f;&#xff1f;&#xff1f; 当时一看这个立马有点慌&#xff0c;我的Python爬虫群&#xff0c;付费社群等等不是都受到影响了&#xff1f; 啥我这个号朋友圈啥的都没发&#xff…

ChatGPT 的 Text Completion

该章节我们来学习一下 “Text Completion” &#xff0c;也就是 “文本完成” 。“Text Completion” 并不是一种模型&#xff0c;而是指模型能够根据上下文自动完成缺失的文本部分&#xff0c;生成完整的文本。 ⭐ Text Completion 的介绍 Text Completion 也称为文本自动补全…

项目管理之如何估算项目工作成本

在项目管理中&#xff0c;如何估算项目工作成本是一个关键问题。为了解决这个问题&#xff0c;我们可以采用自上而下的成本限额估算法和自下而上的成本汇总估算法。这两种方法各有优缺点&#xff0c;但都可以帮助我们准确地估算项目工作成本。 自上而下的成本限额估算法 自上…

运维知识点-Docker从小白到入土

Docker从小白到入土 安装问题-有podmanCentos8使用yum install docker -y时&#xff0c;默认安装的是podman-docker软件 安装docker启动dockeryum list installed | grep dockeryum -y remove xxxx安装Docker安装配置下载安装docker启动docker&#xff0c;并设置开机启动下载所…

MySQL 表的增删查改(CRUD)

MySQL 表的增删查改(CRUD) 文章目录 MySQL 表的增删查改(CRUD)1. 新增(Create)2. 查询(Retrieve)2.1 全列查询2.2 指定列查询2.3 查询字段为表达式2.4 别名2.5 去重&#xff1a;DISTINCT2.6 排序&#xff1a;ORDER BY2.7 条件查询2.8 分页查询: LIMIT 3. 修改(Update)4. 删除(D…

Springboot3整合Mybatis-plus3.5.3报错

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 报错以及Bug ✨特色专栏&#xff1a; …

QT在线安装所有版本,可共存(下载速度飞快)

使用最新的QT在线安装器&#xff0c;安装QT版本时只能安装5.15以及之后的版本&#xff0c;安装QT5.15之前的版本只能通过离线安装的方式&#xff0c;离线安装后还要自己去配置QT&#xff0c;离线安装还有个问题的&#xff0c;后续维护比较麻烦&#xff0c;QT的维护工具还要自己…

ubuntu中如何设置中文输入

文章目录 1.找到设置&#xff08;settings&#xff09;2.找到keyboard3.点击Chinese&#xff0c;选择intelligent pinyin&#xff0c;并点击add4.打开浏览器测试一下 1.找到设置&#xff08;settings&#xff09; 2.找到keyboard 3.点击Chinese&#xff0c;选择intelligent pin…

1+2+4+7+11+16+..x(和不超过3000),求x与式子的和

我们不难发现&#xff1a;每一项的差值成等差数列 用一个for循环&#xff0c;再用一个变量n存储等差数列 for(int i0;i<300;iin) {sumsumi;n; } 完整代码&#xff1a; #include <stdio.h> int main() {int sum 0;int i 0;int n 0;for (i 1;i < 300;i i n){…

如何在React项目中,创建令人惊叹的动画翻转卡片效果

翻转卡片是一种在网站上展示内容的动态而引人入胜的方法。翻转卡片由正面和背面两个面构成。用户可以通过点击或鼠标悬停来翻转卡片以显示更多信息。本文将向您展示如何在React中轻松构建翻转卡片。 为什么翻转卡片是您网站的有价值的补充&#xff1f; 翻转卡片可以为您的网站用…

系列五、过滤器(一)#概述

一、概述 过滤器的作用是对客户端发送给Servlet的请求以及Servlet返回给客户端的响应做一些定制化的处理&#xff0c;例如&#xff1a; &#xff08;1&#xff09;校验请求的参数是否符合逻辑&#xff0c;符合逻辑则放行&#xff0c;不符合逻辑则不允许访问方法 &#xff08;2&…

顺序栈练习

顺序栈练习 相关内容&#xff1a; 1.判断顺序栈栈满的两种方式 2.一张图理解栈顶指针加加减减的问题 3.栈的顺序存储结构&#xff08;顺序栈&#xff09; //顺序栈的初始化、判空、入栈、出栈、读取栈顶元素 //顺序栈的结构&#xff1a;数组、栈顶指针(本质是下标) #include&…

大数据毕业设计选题推荐-旅游景点游客数据分析-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

使用脚手架创建项目,使用组件开发

单文件组件 单文件组件就是一个文件对应一个组件, 单文件组件的名字通常是xxx.vue(命名规范和组件名的命名规范相同),这个文件是Vue框架规定的只有它能够认识&#xff0c;浏览器无法直接打开运行 Vue框架可以将xxx.vue文件进行编译为浏览器能识别的html js css的代码 xxx.vu…

【Python基础知识一】基本语法、常用数据类型等

Python基础知识&#xff1a; 1 标识符&#xff08;Identifier&#xff09;2 关键字/保留字&#xff08;Keyword&#xff09;3 引号4 编码5 输入输出6 行与缩进7 多行语句8 注释9 数据类型9.1 数字(Number)类型9.2 变量&#xff08;variate&#xff09;9.3 字符串&#xff08;St…