flask web学习之flask与http(一)

文章目录

      • 一、请求响应循环
      • 二、HTTP请求
        • 1. 请求报文
        • 2. request对象
        • 3. 在flask中处理请求
            • 3.1 路由匹配
            • 3.2 设置监听的http方法
            • 3.3 URL处理
      • 三、请求钩子

一、请求响应循环

每一个web应用都包含这种处理方式,请求-响应循环:客户端发出请求,服务器端接受请求并返回响应。
在这里插入图片描述
从下图可以看出,HTTP在整个流程中起到了至关重要的作用,它是客户端和服务器端之间沟通的桥梁。

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

二、HTTP请求

URL是一个请求的起源。一个标准的URL由很多部分组成,以下面这个为例:
http://www.baidu.com/hello?name=zly
http::协议字符串,指定要使用的协议。
www.baidu.com:服务器弟子(域名)。
/hello?name=zly:要获取的资源路径(path),类似于unix的文件目录结构。

请求的实质是发送到服务器上的一些数据,这种浏览器与服务器之间交互的数据称为报文,请求时浏览器发送的数据被称为请求报文,而服务器返回的数据被称为响应报文。

1. 请求报文

请求报文由请求的方法、URL、协议版本、首部字段以及内容实体组成。
在这里插入图片描述
常见的http方法类型:

方法说明
get获取资源
post创建或更新资源
put创建或替换资源
delete删除资源
head获得报文首部
options询问支持的方法

报文首部包含了请求的各种信息和设置,比如客户端的类型,是否设置缓存,语言偏好等等。

2. request对象

flask请求对象request,这个请求对象封装了从客户端发来的请求报文。

请求解析和响应封装实际上大部分是由werkzeug完成的,flask子类化werkzeug的请求(Request)和响应(Response)对象并添加了和程序相关的特定功能。

假如此时有一个请求http://www.baidu.com.cn/hello?name=zly
当flask接收到请求后,请求对象会提供多个属性来获取URL的各个部分。常用属性如下表所示:

属性
path‘/hello’
full_path‘/hello?=name=zly’
host‘www.baidu.com.cn’
host_url‘http://www.baidu.com.cn/’
base_url‘http://www.baidu.com.cn/hello’
url‘http://www.baidu.com.cn/hello?name=zly’
url_root‘http://www.baidu.com.cn/’

除了URL之外,请求报文中的其他信息都可以通过Request对象提供的属性和方法获取,常用部分如下表所示:

属性/方法说明
method获取请求的HTTP方法,例如GET、POST、PUT等。
args包含GET请求参数的字典,可以通过request.args[‘key’]或request.args.get(‘key’)来获取特定参数的值。
form包含POST请求参数的字典,可以通过request.form[‘key’]或request.form.get(‘key’)来获取特定参数的值。
files包含上传文件的字典,可以使用request.files[‘file_field_name’]来访问上传的文件。
headers获取请求头部信息,返回一个包含所有请求头的字典。可以使用request.headers[‘header_name’]来获取特定头部的值。
cookies包含所有的Cookie信息的字典,可以使用request.cookies[‘cookie_name’]来获取特定Cookie的值。
session访问当前用户的会话对象,可以使用request.session[‘key’]来获取会话数据。
3. 在flask中处理请求

url是指向网络上资源的地址。在flask中,我们需要让请求的URL匹配对应的视图函数,视图函数返回值就是URL对应的资源。

3.1 路由匹配

在 Flask 中,路由匹配是通过装饰器来完成的。你可以使用 @app.route 装饰器来定义路由,并指定对应的 URL 规则。

from flask import Flask

app = Flask(__name__)

# 定义根路径的路由
@app.route('/')
def index():
    return 'Hello, World!'

# 定义其他路径的路由
@app.route('/about')
def about():
    return 'About page'

@app.route('/user/<username>')
def user_profile(username):
    return f'Profile page of {username}'
    
3.2 设置监听的http方法

在 Flask 中,你可以使用 methods 参数来设置路由监听的 HTTP 方法。这个参数可以是一个字符串,也可以是一个包含多个方法的列表。

from flask import Flask, request

app = Flask(__name__)

# 设置只接受 GET 请求的路由
@app.route('/', methods=['GET'])
def index():
    return 'Hello, World!'

# 设置接受 POST 和 PUT 请求的路由
@app.route('/data', methods=['POST', 'PUT'])
def handle_data():
    if request.method == 'POST':
        return 'Received a POST request'
    elif request.method == 'PUT':
        return 'Received a PUT request'
3.3 URL处理

URL变量部分默认类型为字符串,但flask提供了一些转换器可以在URL规则中使用。

转换器说明
string不包含斜线的字符串
int整数
float浮点数
path包含斜线的字符串,static路由的URL规则中filename变量就使用了这个转换器
any匹配一系列值中的一个
uuiduuid字符串

使用示例:

@app.route('/goback/<int:year>')
def go_back(year):
	return '<p>Welcome to %d!</p> ' % (2018-year)

@app.route('/colors/<any(blue, white, red):color>')
def three_colors(color):
	return color

三、请求钩子

在 Flask 中,你可以使用请求钩子(Request Hooks)来在请求的不同生命周期中执行特定的操作。Flask 提供了一些装饰器来定义这些钩子函数。
以下是几个常用的请求钩子:

  1. before_request:在每个请求处理之前执行。可以用于进行认证、权限检查等操作。例如网站要记录用户最后在线的时间,可通过用户最后发送的请求时间来实现。
  2. after_request:在每个请求处理之后执行,但只有在没有未处理的异常时才会执行。可以用于修改响应、添加头部信息等操作。例如我们经常在视图函数中进行数据库操作,比如更新、插入等,之后需要将更改提交数据库中,提交更改的代码可以放到此钩子中。
  3. teardown_request:在每个请求处理之后执行,无论是否发生异常。可以用于清理资源、关闭数据库连接等操作。
  4. before_first_request:在第一个请求处理之前执行,用于初始化应用程序的全局状态。例如在玩具程序中,运行程序前我们需要进行一些程序的初始化操作,比如创建数据库表,添加管理员用户。
from flask import Flask

app = Flask(__name__)

# 在每个请求处理之前执行的钩子
@app.before_request
def before_request():
    # 在这里执行需要在每个请求之前进行的操作
    print('Before Request')

# 在每个请求处理之后执行的钩子
@app.after_request
def after_request(response):
    # 在这里执行需要在每个请求之后进行的操作
    print('After Request')
    return response

# 在每个请求处理之后(包括异常情况)执行的钩子
@app.teardown_request
def teardown_request(exception=None):
    # 在这里执行需要在每个请求之后进行的操作
    print('Teardown Request')

# 在第一个请求处理之前执行的钩子
@app.before_first_request
def before_first_request():
    # 在这里执行需要在第一个请求之前进行的操作
    print('Before First Request')

# 定义路由
@app.route('/')
def index():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实战经验分享,Python 连接 Oracle 踩坑实录

最近的一个测试任务需要测试 oracle 同步 hive 数据库的性能&#xff0c;那就需要对 oracle 数据库灌注测试数据。我就又打开了我的IDE&#xff0c;准备把我之前一下可以灌50w数据到 MySQL 的代码&#xff0c;改一改&#xff0c;直接用。 因为我在网上看到&#xff0c;语法上也…

基于Springboot的社区医院管理服务系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的社区医院管理服务系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

高低温交变湿热实验箱

产品概述 武汉凯迪正大高低温实验箱&#xff08;恒温恒湿试验箱&#xff09;乃针对各种材质表面处理&#xff0c;包含涂料、电镀、有机及无机皮膜&#xff0c;阳极处理&#xff0c;防锈油等防腐处理后测试其耐腐蚀性&#xff0c;从而确立产品的质量。 产品特点 1、内箱尺寸…

全网最新最全面的Appium自动化:Appium常用操作之按键类操作

按键类操作 按键类操作用来模拟在手机设备上进行按键操作&#xff08;推荐使用 方式一 &#xff09; 方式一、press_keycode(self,keycode,metastateNone,flagsNone)&#xff1a;模拟按键输入&#xff0c;其中&#xff1a; keycode&#xff1a;发送到设备的键值编码可以通过An…

华为快应用中自定义Slider效果

文章目录 一、前言二、实现代码三、参考链接 一、前言 在华为快应用中官方提供了<slider>控件&#xff0c;但是这个控件的限制比较多&#xff0c;比如滑块无法自定义&#xff0c;所以这里进行下自定义&#xff0c;自己修改样式。 二、实现代码 整体效果如下: 源码如下…

【数据结构(七)】查找算法

文章目录 查找算法介绍1. 线性查找算法2. 二分查找算法2.1. 思路分析2.2. 代码实现2.3. 功能拓展 3. 插值查找算法3.1. 前言3.2. 相关概念3.3. 实例应用 4. 斐波那契(黄金分割法)查找算法4.1. 斐波那契(黄金分割法)原理4.2. 实例应用 查找算法介绍 在 java 中&#xff0c;我们…

全面解析修复msvcr120.dll缺失问题的方法,msvcr120.dll丢失的原因

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“msvcr120.dll丢失”。这个错误通常会导致某些程序无法正常运行&#xff0c;给用户带来很大的困扰。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何修复呢&#xff1f;本文…

Linux基础项目开发1:量产工具——UI系统(五)

前言&#xff1a; 前面我们已经把显示系统、输入系统、文字系统搭建好了&#xff0c;现在我们就要给它实现按钮操作了&#xff0c;也就是搭建UI系统&#xff0c;下面让我们一起实现UI系统的搭建吧 目录 一、按钮数据结构抽象 ui.h 二、按键编程 1.button.c 2.disp_manager…

使用rust slint开发桌面应用

安装QT5&#xff0c;过程省略 安装rust&#xff0c;过程省略 创建工程 cargo new slint_demo 在cargo.toml添加依赖 [dependencies] slint "1.1.1" [build-dependencies] slint-build "1.1.1" 创建build.rs fn main() {slint_build::compile(&quo…

使用 async/await 是必须避免的陷阱

使用 async/await 是必须避免的陷阱 如果我们使用过 nodejs&#xff0c;那么我们可能已经在 javaSoript 中使用了异步操作。异步任务是一个独立于 JavaSoript 引擎的主线程执行的操作。从本质上讲&#xff0c;这就是应用程序功能没有阻塞的 UI 的原因。 nodejs 的单线程性质&a…

华容道问题求解第一部分_思路即方案设计

一、前言 华容道是一种传统的益智游戏&#xff0c;通常由一个长方形木板和若干个方块组成。其中包括一个或多个不同颜色的方块&#xff08;也称为车块&#xff09;和其他大小相同的方块&#xff08;也称为障碍块&#xff09;。游戏的目标是将车块从木板的一个端点移动到另一个…

【mysql】mysgld.log文件太大怎么办

我们有一台测试服务器。跑着一个msyq&#xff0c;发现没有空间了。差看日志文件占用了很多。 怎么破 使用下面命令 echo "" >mysqld.log 执行命令后

PostGIS学习教程九:空间连接

PostGIS学习教程九&#xff1a;空间连接 空间连接&#xff08;spatial joins&#xff09;是空间数据库的主要组成部分&#xff0c;它们允许你使用空间关系作为连接键&#xff08;join key&#xff09;来连接来自不同数据表的信息。我们认为“标准GIS分析”的大部分内容可以表示…

直播预告 | 降本增效持续深化,如何找准 FinOps 关键着力点?

企业落地 FinOps 有哪些实施路径和阶段规划&#xff1f;2023 年&#xff0c;业界 FinOps 取得了哪些进展&#xff1f;12 月 6 日&#xff0c;「降本增效持续深化&#xff0c;如何找准 FinOps 关键着力点」专题直播即将开讲。小红书基础技术部混合云资源管理负责人梁啟成将带来《…

无法从SD卡中删除文件怎么办?

在使用SD卡时&#xff0c;有时我们会无法从SD卡中删除文件&#xff0c;那么这该怎么办呢&#xff1f;下面我们就一起来了解一下吧。 方式1. 检查SD卡&#xff08;读卡器&#xff09;上的写保护选项卡 对于某些SD卡&#xff0c;SD卡的一侧可能有一个开关&#xff0c;并有标有Lo…

AntDesignBlazor示例——创建项目

本示例是AntDesign Blazor的入门示例&#xff0c;在学习的同时分享出来&#xff0c;以供新手参考。 示例代码仓库&#xff1a;https://gitee.com/known/AntDesignDemo 1. 开发环境 VS2022 17.8.2.NET8AntDesign 0.16.2 2. 学习目标 创建新项目安装AntDesign组件包及使用方…

Leetcode 77 组合

题意理解&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 如&#xff1a;n3,k2,则有&#xff1a;12 13 23 一般&#xff0c;我们使用回溯法来解决组合问题。 组合问题没有顺序要求&#xff0c;所以 12 21 是同一个组合&#xff08;如…

【Linux驱动开发】环境搭建Linux驱动开发环境

环境搭建Linux驱动开发环境 1. 简单描述2. 资源3. 安装4. 基本操作和设置 1. 简单描述 基于讯为电子rk3568教程 2. 资源 下载 VMware Workstation Pro 17 链接 Ubuntu 桌面版&#xff08;64位&#xff09; 链接 3. 安装 需要选择自定义硬件&#xff08;内存大于16g 硬盘500g…

试验数字化平台WDP 助力车企数据管理加速度

一 现状 随着现代测控技术的提高&#xff0c;数据结构变得越来越复杂多样&#xff0c;数据量也在日益增大。又因试验条件的限制&#xff0c;大多数企业的数据管理方式主要是通过各类电子文档将试验数据保存在每个工程师的移动电脑中&#xff0c;再进行汇总存储和共享。这种落后…

【计算机系统基石与Linux进程管理深度解析】

​​​​​​​ 【本节重点】 认识冯诺依曼系统 操作系统概念与定位 深入理解进程概念&#xff0c;了解PCB 学习进程状态&#xff0c;学会创建进程&#xff0c;掌握僵尸进程和孤儿进程&#xff0c;及其形成原因和危害 1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如…
最新文章