Python Flask框架(二)Flask与HTTP

ops/2025/2/21 14:10:45/

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请求。

python">@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()函数来生成重定向响应:

python">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()函数中传入状态码即可返回对应的错误响应。

python">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.ppmy.cn/ops/40012.html

相关文章

使用HashMap实现,对一个字符集进行哈夫曼编码

最终达到的效果: 调用一个类 class HuffmanCodin{.....} 使用类中的静态方法&#xff0c;获取哈夫曼编码&#xff1a; 事前准备——哈夫曼树的节点定义 class Node implements Comparable<Node> {int weight;//权重Node left;Node right;char ch;//关键字&#xff0c…

Windows+Linux的虚拟串口工具

文章目录 1.Windows虚拟串口工具1.1 安装教程1.2 使用方法 2.Linux系统虚拟串口工具2.1 socat安装2.2 开启虚拟串口2.3 测试2.3.1 命令测试2.3.2 Cutecom工具测试 2.4 关闭虚拟串口 3.参考资料 1.Windows虚拟串口工具 下载地址&#xff1a;https://www.downxia.com/downinfo/4…

01-背包

此为本蒟蒻第n次发文,若有错误或不足之处,还请各位牛犇多多指出。 目录 引入 01背包 时间复杂度 O ( n 2 ) O(n^2) O(n2) 空间复杂度 O ( n 2 ) O(n^2) O(n2) 代码 滚动数组优化 空间复杂度 O ( n ) O(n) O(n) 代码 练习与拓展 资源来源与参考 0. 引入 在正式开始讲『01背…

笔记3:torch训练测试VGG网络

&#xff08;1&#xff09;利用Netron查看网络实际情况 上图链接 python生成上图代码如下&#xff0c;其中GETVGGnet是搭建VGG网络的程序GETVGGnet.py&#xff0c;VGGnet是该程序中的搭建网络类。netron是需要pip安装的可视化库&#xff0c;注意do_constant_foldingFalse可以防…

远程调用feign的使用

在orderservice子工程中 <!--feign的远程--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>启动类加上这个注解 EnableFeignClients //自动装配…

泛微OA表单调用JSP

表单插入JS代码,并且设置id,传入表单参数给后端,后端添加jsp文件,使用ajax调用,详细步骤如下: 对应的框内添加id属性,如下图: 然后插入js代码,代码如下: <script> jQuery(document).ready(function() {// 在表单的按钮单元格插入自定义属性:ID:btnLinkvar …

Electron学习笔记(六)

文章目录 相关笔记笔记说明 七、系统5、托盘图标(1)、设置托盘图标(2)、托盘图标闪烁(3)、托盘图标菜单 6、剪切板(1)、写入剪切板(2)、读取剪切板 7、系统通知8、其他(1)、使用系统默认应用打开文件(2)、接收拖拽到窗口中的文件(3)、使用系统字体 相关笔记 Electron学习笔记&…

数据库出现死锁的解决方法参考

死锁引起的原因一般是多个用户并发访问数据库导致的问题&#xff0c;或是因为某个进程挂死以后资源未释放导致的。通过onstat –p可查看deadlks项大于0即表示历史总计死锁次数。对于被锁的表进行操作的时候会出现-143 ISAM error: deadlock detected的错误。当其他会话访问此表…