【Flask 系统教程 3】请求与响应

Flask 是一个灵活而强大的 Web 框架,而请求与响应则是构建 Web 应用的核心组成部分。在本文中,我们将探讨 Flask 中请求与响应的各种用法,包括不同的请求方法、重定向、响应对象、获取查询参数以及文件上传等。

请求

在 Flask 中,请求是客户端(浏览器)向服务器发送的消息,用于获取某种资源或执行某种操作。我们可以通过不同的方法来处理这些请求。

请求方式

通过使用不同的装饰器直接设置请求方法

from flask import Flaskapp = Flask(__name__)@app.get('/get_example')
def get_example():return 'This is a GET request.'@app.post('/post_example')
def post_example():return 'This is a POST request.'@app.delete('/delete_example')
def delete_example():return 'This is a DELETE request.'@app.put('/put_example')
def put_example():return 'This is a PUT request.'if __name__ == '__main__':app.run(debug=True)

对于不同的请求方式使用不同的装饰器即可进行设置。


通过装饰器 methods 参数设置请求方法

from flask import Flask, requestapp = Flask(__name__)# GET 请求方法
@app.route('/get_example', methods=['GET'])
def get_example():return 'This is a GET request.'# POST 请求方法
@app.route('/post_example', methods=['POST'])
def post_example():return 'This is a POST request.'# PUT 请求方法
@app.route('/put_example', methods=['PUT'])
def put_example():return 'This is a PUT request.'# DELETE 请求方法
@app.route('/delete_example', methods=['DELETE'])
def delete_example():return 'This is a DELETE request.'# 支持 GET 和 POST 请求方法 
@app.route('/get_post_example', methods=['GET', 'POST'])  # 支持传入列表,实现多个方法
def get_post_example():if request.method == 'GET':return 'This is a GET request.'elif request.method == 'POST':return 'This is a POST request.'if __name__ == '__main__':app.run(debug=True)

重定向

在 Web 开发中,重定向是一种常见的技术,用于将用户从一个 URL 地址重定向到另一个 URL 地址。Flask 提供了多种重定向的方式,通过不同的状态码来实现不同的重定向效果。

from flask import Flask, url_for, redirectapp = Flask(__name__)@app.route('/redirect_example/')
def redirect_example():# 重定向到指定的 URL,并返回 301 状态码return redirect(url_for('target_route'), code=301)@app.route('/target_route/')
def target_route():return "you get it here"if __name__ == '__main__':app.run(debug=True)

在以上示例中,使用函数 redirect即可实现对路由的重定向,并且可以设置状态码

  • 重定向状态码以及含义
状态码名称含义
301永久重定向请求的资源已被永久分配了新的 URL。
302发现请求的资源已被临时分配了新的 URL。
303查看其他位置对请求的响应可以在不同的 URL 下找到,并且应该使用 GET 方法检索请求的资源。
307临时重定向请求的资源已被临时移动到另一个位置。
308永久重定向请求的资源已被永久移动到另一个位置。

响应

响应是服务器返回给客户端的消息,它可以包含文本、JSON 数据、文件等内容。

响应对象

Flask 提供了 make_response() 函数用于创建响应对象,我们可以通过这个对象来设置响应的内容和状态码,同时 Flask也支持直接响应对应的数据

from flask import make_response# 响应模板
@app.route('/')
def index():return render_template('index.html')
# template_folder 指定模板文件夹 默认是同级目录的 templates# 响应字符串
@app.route('/string')
def return_string():return "Hello, World!"# 响应 JSON 数据
@app.route('/json')
def return_json():data = {'message': 'Hello, World!'}return data# return jsonify(data) 的效果一样,老版本不支持直接返回,必须要用jsonify# 响应元组
@app.route('/tuple')
def return_tuple():response = ("Hello, World!", 200, {'Content-Type': 'text/plain'})response2 = ("Hello, World!", 200, [('Content-Type', 'text/plain')])response3 = ("Hello, World!", {'Content-Type': 'text/plain'})# 这都是合法的写法return responseif __name__ == '__main__':app.run(debug=True)

可以返回一个元组,元组中必须至少包含一个项目,且项目应当由 (response, status) 、 (response, headers)或者 (response, status, headers)组成。 status的值会重载状态代码, headers是一个由额外头部值组成的列表 或字典, status值会覆盖状态代码, headers可以是一个列表或字典,作为额外的消息标头值。

除了返回文本外,我们还可以返回 JSON 数据、元组(包含响应内容、状态码和头信息)、模板等。

自定义响应对象

如果 Flask 提供的响应对象不能满足需求,我们还可以自定义响应对象。

from flask import Flask, make_response, Responseapp = Flask(__name__)# 使用 response 返回自定义响应对象
@app.route('/response')
def custom_response():content = "Custom Response with response"code = 200headers = {'Content-Type': 'text/plain'}custom_resp = Response(content, code, headers)return custom_resp# 使用 make_response 返回自定义响应对象
@app.route('/make_response')
def make_custom_response():content = "Custom Response with make_response"code = 200headers = {'Content-Type': 'text/plain'}custom_resp = make_response(content, code)custom_resp.headers.extend(headers)return custom_respif __name__ == '__main__':app.run(debug=True)

获取查询参数

在处理 GET 请求时,我们经常需要获取 URL 中的查询参数。Flask 提供了 request.args 来获取查询参数。

from flask import request@app.route('/search')
def search():keyword = request.args.get('q')return 'Search keyword: {}'.format(keyword)

而在处理 POST 请求时,则可以使用 request.form来获取对应的参数

@app.route('/example_post', methods=['POST'])
def example_post():# 获取表单中的参数name = request.form.get('name')return 'Hello, {}'.format(name)

但是无论对于GET请求或者POST请求,都可以使用 request.values来获取参数,用法与上一致。


文件上传

处理文件上传也是 Web 开发中的常见需求。Flask 提供了 request.files 来获取上传的文件。

from flask import Flask, request, render_templateapp = Flask(__name__)@app.route('/upload', methods=['POST'])
def upload_image():if 'pic' not in request.files:return "未上传文件"file = request.files['pic']  # pic是上传参数的keyfile.save("test.png")return "文件上传成功"if __name__ == '__main__':app.run(debug=True)

结语

通过本文的介绍,我们深入了解了 Flask 中请求与响应的多种用法。无论是处理不同的请求方法、实现重定向、创建不同类型的响应对象,还是处理查询参数和文件上传,Flask 都提供了丰富的功能和灵活的方法,使得 Web 开发变得更加简单和高效。希望本文对您有所帮助!

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

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

相关文章

临期食品店会员配送商城小程序的作用是什么

临期商品以量大价格低/即时性吸引市场大量客户,很多地区都有门店,行业也不乏连锁/加盟品牌,食品受众广且区域拓展性强,商家可线上销售提升营收和解决线下难题。 商家运用【雨科】平台搭建临期食品店商城小程序,对生意…

PyTorch如何修改模型(魔改)

文章目录 PyTorch如何修改模型(魔改)1.修改模型层(模型框架⭐)1.1通过继承修改模型1.2通过组合修改模型(重点学👀)1.3通过猴子补丁修改模型 2.添加外部输入3.添加额外输出参考 PyTorch如何修改模型(魔改) 对模型缝缝补…

【算法刷题 | 动态规划02】5.02(不同路径、不同路径||、整数拆分、不同的二叉搜索树)

文章目录 5.不同路径5.1题目5.2解法一:深度搜索5.2.1深度搜索思路5.2.2代码实现 5.3解法二:动规5.3.1动规思路5.3.2代码实现 6.不同路径||6.1题目6.2解法:动规6.2.1动规思路(1)dp数组以及下标含义(2&#x…

基于Springboot的交流互动系统

基于SpringbootVue的交流互动系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 帖子信息 聚会信息 后台登录 后台管理首页 用户管理 帖子分类管理 帖子信息…

Python语言零基础入门——文件

目录 一、文件的基本概念 1.文件 2.绝对路径与相对路径 3.打开文件的模式 二、文件的读取 三、文件的追加 四、文件的写入 五、with语句 六、csv文件 1.csv文件的读取 2.csv文件的写入 七、练习题:实现日记本 一、文件的基本概念 1.文件 文件是以计算…

Mysql中索引的概念

索引相关概念 基础概念: 在MySQL中,索引是一种数据结构,用于加快数据库查询的速度和性能。索引可以帮助MySQL快速定位和访问表中的特定数据,就像书籍的索引一样,通过存储指向数据行的指针,可以快速…

ICode国际青少年编程竞赛- Python-1级训练场-路线规划

ICode国际青少年编程竞赛- Python-1级训练场-路线规划 1、 Dev.step(3) Dev.turnLeft() Dev.step(4)2、 Dev.step(3) Dev.turnLeft() Dev.step(3) Dev.step(-6)3、 Dev.step(-2) Dev.step(4) Dev.turnLeft() Dev.step(3)4、 Dev.step(2) Spaceship.step(2) Dev.step(3)5、…

Android手写自己的路由SDK

实现自己的路由框架 ​ 在较大型的Android app中常会用到组件化技术,针对不同的业务/基础功能对模块进行划分,从上到下为壳工程、业务模块、基础模块。其中业务模块依赖基础模块,壳工程依赖业务模块。同级的横向模块(比如多个业务…

软件杯 深度学习的动物识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

MySQL-逻辑架构

1、MySQL服务器处理客户端请求 MySQL是典型的C/S架构,服务端程序使用 mysqld。实现效果:客户端进程像服务端发送(SQL语句),服务器进程处理后再像客户端进程发送 处理结果。 2、connectors 指不同语言中与SQL的交互…

【C++】双指针算法:四数之和

1.题目 2.算法思路 这道题目十分困难,在leetcode上的通过率只有36%,大家要做好心理准备。 在做个题目前强烈建议大家先看看我的上一篇博客:有效三角形个数,看完之后再去leetcode上写一写三数之和,搞懂那两个题目之后…

JavaEE 初阶篇-深入了解 Junit 单元测试框架和 Java 中的反射机制(使用反射做一个简易版框架)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Junit 单元测试框架概述 1.1 使用 Junit 框架进行测试业务代码 1.2 Junit 单元测试框架的常用注解(Junit 4.xxx 版本) 2.0 反射概述 2.1 获…

计算机毕业设计php自行车在线租赁管理系统-vue+mysql

本系统的开发使获取自行车在线租赁管理系统信息能够更加方便快捷,同时也使自行车在线租赁管理系统管理信息变的更加系统化、有序化。系统界面较友好,易于操作。 自行车在线租赁管理系统,主要的模块包括首页、个人中心、用户管理、会员管理、自…

软件系统安全设计(安全保证措施)

软件安全保证措施word 软件所有全套资料获取进主页或者本文末个人名片直接。

C++之set/map相关实现

看着上面的图片,你可能对set和map的多样变化产生疑惑,下面我们就来详细讲解他们的区别以及实现 一.set/map 首先,在这里我们要声明,如果你对二叉搜索树一点都不了解的话,建议你先去将搜索二叉树学会再来学习这里的内…

ArkTS开发原生鸿蒙HarmonyOS短视频应用

HarmonyOS实战课程“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”已经于今日上线至慕课网(https://coding.imooc.com/class/843.html),有致力于鸿蒙生态开发的同学们可以关注一下。 课程简介 本课程以原生鸿蒙Ha…

【Canvas与艺术】新制无底图安布雷拉暗黑系桌面(1920*1080)

【主要变化】 1.去掉底图&#xff0c;改为金丝正六边形组合而成的网格&#xff1b; 2.将安布雷拉标志调暗&#xff1b; 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html;…

深入学习@TableField注解:MyBatis-Plus中的字段映射技术解析

深入学习TableField注解&#xff1a;MyBatis-Plus中的字段映射技术解析 一、 介绍1、TableField注解的作用2、TableField注解的属性3、实际应用场景4、注意事项5、示例代码6、结论 一、 介绍 在基于Java的持久化框架中&#xff0c;实体类的字段映射到数据库表的列是一个基本操…

力扣HOT100 - 78. 子集

解题思路&#xff1a; class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> lists new ArrayList<>(); // 解集lists.add(new ArrayList<Integer>()); // 首先将空集加入解集中for(int i 0; i < n…

Mac 安装 JDK21 流程

一、下载JDK21 访问Oracle官方网站或选择OpenJDK作为替代品。Oracle JDK从11版本开始是商业的&#xff0c;可能需要支付费用。OpenJDK是一个免费开源选项。 Oracle JDK官方网站&#xff1a;Oracle JDK Downloads OpenJDK官方网站&#xff1a;OpenJDK Downloads 这里以JDK21为…