Python Flask框架(二)Flask与HTTP

news2024/11/16 13:55:52

HTTP,即超文本传输协议,定义了服务器与客户端之间信息交流的格式和传递方式。

请添加图片描述

当用户访问一个URL,浏览器便生成对应的HTTP请求,经由互联网发送到对应的Web服务器。Web服务器接收请求,通过WSGI将HTTP格式的请求数据转换成Flask程序能够使用的Python数据。在程序中,Flask根据请求的URL执行对应的视图函数,获取返回值生成响应。响应依次经过WSGI转换成HTTP响应,再经由Web服务器传递,最终被发出请求的客户端接收。浏览器渲染响应中包含的HTML和CSS代码,并执行JavaScript代码,最终把解析后的页面呈现在用户浏览器的窗口中。

HTTP请求是以报文的形式发送,报文由报文首部和报文主体组成,两者由空行分割。报文首部包括HTTP方法、URL、协议以及其它首部字段。常见的HTTP方法如下:

方法说明方法说明
GET获取资源DELETE删除资源
POST创建或更新资源HEAD获得报文首部
PUT创建或替换资源OPTIONS询问支持的方法

在Flask中处理请求

flask提供了request模块,请求报文中的所有信息都可以通过request模块提供的属性和方法获取。

为了便于将请求分发到对应的视图函数,程序实例中存储了一个路由表(app.url_map),其中定义了URL规则和试图函数的映射关系。当请求发来后,Flask会根据请求报文中的URL来尝试与路由表中的所有URL规则进行匹配,匹配成功则调用相应的试图函数,匹配失败则返回404错误响应。

我们可以在app.route装饰器中使用methods参数传入一个包含监听的HTTP方法的可迭代对象。比如,下面的视图函数同时监听GET请求和POST请求。

@app.route('/hello',methods=['GET','POST'])
def hello():
	return '<h1>Hello,Flask!</h1>'

通过定义方法列表,我们可以为同一个URL规则定义多个视图函数,分别处理不同HTTP方法的请求。

有时我们需要对请求进行预处理和后处理,这时可以使用Flask提供的一些请求钩子(Hook)函数。这些请求钩子函数使用装饰器标识,用法很简单,以before_request钩子为例,当你对一个函数附加了app.before_request装饰器后,就会将这个函数注册为before_request处理函数,每次执行请求前都会触发该处理函数。Flask默认的五种请求钩子如下表

钩子说明
before_first_request注册一个函数,在处理第一个请求前运行
before_request注册一个函数,在处理每个请求前运行
after_request注册一个函数,如果没有未处理的异常抛出,会在每个请求结束后运行
teardown_request注册一个函数,即使有未处理的异常抛出,会在每个请求结束后运行。如果发生异常,会传入异常对象作为参数到注册的函数中
after_this_request在视图函数内注册一个函数,会在这个请求结束后运行

视图函数的返回值会作为响应报文的报文主体返回给客户端。响应报文包括协议、状态码、原因短语等组成的报文首部和报文主体构成。

重定向响应,当客户端向服务器请求资源时,服务器返回的不是资源数据而是新的URL地址,这个就是重定向响应。浏览器接收到重定向响应后会向新的URL发起新的GET请求。Flask提供了redirect()函数来生成重定向响应:

from flask import Flask, redirect, url_for
...
@app.route('/hi')
def hi():
	...
	return redirect(url_for('hello')) #重定向到/hello
@app.route('/hello')
def hello():
	...

大多数情况下,Flask会自动处理常见的错误响应。如果想手动返回错误响应,更方便的方法是使用Flask提供的abort()函数。在abort()函数中传入状态码即可返回对应的错误响应。

from flask import Flask, abort
...
@app.route('/404')
def not_found():
	abort(404) #abort函数前不需要使用return语句,但一旦abort被调用,abort函数之后的代码将不会被执行

session:安全的Cookie

Cookie在Web程序中发挥了很大作用,其中最重要的功能是存储用户的认证信息。我们先来看看基于浏览器的用户认证是如何实现的。当我们使用浏览器登录某个社交网站时,会在登陆表单中填写用户名和密码,单机登录按钮后,这会向服务器发送一个包含认证数据的请求。服务器接收请求后会查找对应的账户,然后验证密码是否匹配,如果匹配,就在返回的响应中设置一个cookie,比如,“login_user:greyli”。响应被浏览器接收后,cookie会被保存在浏览器中。当用户再次向这个服务器发送请求时,根据请求附带的cookie字段的内容,服务器上的程序就可以判断用户的认证状态,并识别出用户。

但在浏览器中手动添加和修改cookie是一件很容易的事,认证信息以明文的形式存在cookie里存在安全风险,方便的是,Flask提供了session对象用来将cookie数据加密存储。

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

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

相关文章

AI日报:干翻AI PC!苹果M4芯片首发;GoEnhance可生成粘土风格视频;DeepSeek-V2模型已在魔搭社区开源

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;AIbase - 智能匹配最适合您的AI产品和网站 1、干翻AI …

【Unity】如何获得TMP Button下的text内容

【背景】 unity项目中使用了TMP命名空间的Button UI组件。脚本中需要获得Button下Text的内容,但是发现用TextMeshPro仍然无法获得button下的text对象。 【分析】 Hierarchy结构上看明确Button下是有Text组件的: 括号里是TMP,所以理论上用TextMeshPro类型去FindComponent…

【neteq】tgcall的调用、neteq的创建及接收侧ReceiveStatisticsImpl统计

G:\CDN\P2P-DEV\Libraries\tg_owt\src\call\call.cc基本是按照原生webrtc的来的:G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\group\GroupInstanceCustomImpl.cpptg对neteq的使用 worker 线程创建call Call的config需要neteqfactory Call::CreateAu…

linux 使用intel oneapi报错报错

使用intel oneapi 2024.1.0 时经常报这个错误 因为当前 intel2024.1.0没有在使用 需要改回2024.0.0并安装适配的torch的包来运行

详解DOM编程

华子目录 DOM操作Document对象document对象属性属性示例document对象方法示例DOM对象节点 操作网页元素分为两步:DOM元素的选中方式DOM操作文本内容DOM操作对象属性DOM操作元素样式 DOM操作 学习网址 DOM学习&#xff1a; http://c.biancheng.net/view/9360.html 交互事件学习…

P8799 [蓝桥杯 2022 国 B] 齿轮

P8799 [蓝桥杯 2022 国 B] 齿轮 分析 最右边的齿轮的转速是最左边齿轮的q倍 最右边的齿轮的半径是最左边齿轮的q倍 题意即为&#xff1a;查询数组中是否存在两个数&#xff0c;其中一个是另一个的q倍 题目范围&#xff1a;查询次数q:2*10^5&#xff0c;数组范围2*10^5&…

PyTorch中定义自己的数据集

文章目录 1. 简介2. 查看PyTorch自带的数据集(可视化)3. 准备材料3.1 图片数据3.2 标签数据 4. 方法 1. 简介 尽管PyTorch提供了许多自带的数据集&#xff0c;如MNIST、CIFAR-10、ImageNet等&#xff0c;但它们对于没有经验的用户来说&#xff0c;理解数据加载器的工作原理以及…

品牌舆情监测工作要怎么做?

一个负面舆论的传播&#xff0c;可能在短时间内对企业品牌形象造成巨大损害&#xff0c;甚至引发舆情危机。因此&#xff0c;如何有效地进行品牌舆情监测&#xff0c;成为企业不可忽视的问题。伯乐网络传媒多年网络公关、舆情监测经验&#xff0c;今天就来给大家分享一下。 一、…

wsl2安装rancher及导入k3s集群

环境准备 安装wsl2点击此文]ubuntu20.04安装docker 点击此文,安装完成后docker镜像仓库改成阿里云镜像加速地址.如果不熟请点击此文 docker 安装rancher 启动wsl,根据官方文档以root身份执行 sudo docker run -d --restartunless-stopped -p 80:80 -p 443:443 --privileged …

Redis 支持的 Java 客户端都有哪些?

Redis 是一种高性能的键值存储系统&#xff0c;它以其快速、灵活和可扩展的特性而闻名。在 Java 开发中&#xff0c;与 Redis 交互的方式通常是通过使用 Redis 的 Java 客户端。 这些客户端提供了访问 Redis 数据库的接口&#xff0c;使开发人员能够在 Java 应用程序中轻松地使…

软件设计师(案例分析)

软件设计师 数据流图总结 数据库总结 面向对象分析 数据流图 做题方法&#xff1a; 第一题&#xff1a;找外部实体&#xff0c;这个实体可以是系统也可以是人&#xff0c;比如客户中介等。 第二题&#xff1a;数据存储&#xff0c;这个比较简单&#xff0c;根据加工就可以看出来…

硬件知识积累 音频插座的了解,看音频插座的原理图来了解音频插座的引脚。

1. 音频接口 音频插座是一种用于连接音频信号线路的电子元件&#xff0c;常见于音频设备&#xff08;如音响、耳机、话筒等&#xff09;中。它的主要作用是将电子信号转化为声音信号&#xff0c;以满足人们对于音乐、电影、游戏等方面的需求。 根据插头形状的不同&#xff0c;音…

通过编写dockerfile部署python项目

docker命令总览 docker通过dockerfile构建镜像常用命令 # 创建镜像&#xff08;进入dockerfile所在的路径&#xff09; docker build -t my_image:1.0 .# 查看镜像 docker images# 创建容器 docker run -dit --restartalways -p 9700:9700 --name my_container my_image:1.0 #…

跟随Facebook的足迹:社交媒体背后的探索之旅

在当今数字化时代&#xff0c;社交媒体已经成为了人们日常生活中不可或缺的一部分。而在这庞大的社交媒体网络中&#xff0c;Facebook作为其中的巨头&#xff0c;一直在引领着潮流。从创立之初的一个大学社交网络到如今的全球性平台&#xff0c;Facebook的发展历程承载了无数故…

【LeetCode】链表oj专题

前言 经过前面的学习&#xff0c;咋们已经学完了链表相关知识&#xff0c;这时候不妨来几道链表算法题来巩固一下吧&#xff01; 如果有不懂的可翻阅之前文章哦&#xff01; 个人主页&#xff1a;小八哥向前冲~-CSDN博客 数据结构专栏&#xff1a;数据结构【c语言版】_小八哥…

初学者必知:ARM与单片机的区别

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「ARM的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;ARM和单片机之间有许多区别&#…

使用Processing和PixelFlow库创建交互式流体太极动画

使用Processing和PixelFlow库创建交互式流体太极动画 引言准备工作效果展示代码结构代码解析第一部分&#xff1a;导入库和设置基本参数第二部分&#xff1a;流体类定义MyFluidDataConfig 类详解MyFluidData 类详解my_update 方法详解流体类定义完整代码 第三部分&#xff1a;太…

信创基础软件之中间件

信创基础软件之中间件 中间件概述 中间件是一种应用于分布式系统的基础软件&#xff0c;位于应用与操作系统、数据库之间&#xff0c;主要用于解决分布式环境下数据传输、数据访问、应用调度、系统构建和系统集成、流程管理等问题&#xff0c;是分布式环境下支撑应用开发、运…

深圳CPDA|如何利用数据分析改进业务流程,提高效率?

在当今数字化时代&#xff0c;数据已经成为企业决策和优化的关键资源。通过有效地收集、分析和应用数据&#xff0c;企业可以深入了解其业务流程中的瓶颈和问题&#xff0c;从而改进流程&#xff0c;提高效率。本文将探讨如何利用数据分析改进业务流程&#xff0c;并提高效率。…

FebHost:什么是.ME域名?

.ME域名是一个独一无二且被广泛接受的顶级域名&#xff08;TLD&#xff09;&#xff0c;在近年来逐渐受到了大众的喜爱。最初&#xff0c;它被设定为黑山的国家/地区代码顶级域名&#xff08;ccTLD&#xff09;。但现在&#xff0c;.ME已经发展成为一个全球公认的顶级域名&…