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 Flaskapp = 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, requestapp = 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 Flaskapp = 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.mzph.cn/news/200326.shtml

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

相关文章

rvos 3编译与链接

做下面的两个练习需要&#xff1a; 在vmvb上装一个ubuntu会gcc、vi的基本使用 用vi写一个hello.cgcc -o hello.creadelf -h hello.oreadelf -S hello.oobjdump -S hello.o 用vi编辑一个test.cgcc -c test.creadelf -S test.o.text:代码 .data:初始化的全局变量和静态变量…

MYSQL练题笔记-高级查询和连接-连续出现的数字

一、题目相关内容 1&#xff09;相关的表和题目 2&#xff09;帮助理解题目的示例&#xff0c;提供返回结果的格式 二、自己初步的理解 其实这一部分的题目很简单&#xff0c;但是没啥思路啊&#xff0c;怎么想都想不通&#xff0c;还是看题解吧&#xff0c;中等题就是中等题…

力扣215. 数组中的第K个最大元素

堆排序 前言 面试中著名的 TopK 排序&#xff1b;常见的解法有冒泡排序、堆排序&#xff1b;更深入的思路可以参考&#xff1a;拜托&#xff0c;面试别再问我TopK了&#xff01;&#xff01;&#xff01;使用了堆排序的算法&#xff0c;关于堆可以参考&#xff1a;堆数据结构的…

Linux 命令chgrp chown chmod

chgrp chown chmod 介绍 chgrp : 修改文件所属用户组 chown : 修改文件拥有者 chmod : 修改文件权限1 chgrp 命令功能: chgrp命令用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中&#xff0c;组名可以是用户组的id&#xff0c;也可以是用户组的组…

openEuler 22.03 升级openssh9.5

yum安装编译依赖的组件 yum install -y rpm-build gcc gcc-c glibc glibc-devel openssl-devel openssl pcre-devel zlib zlib-devel make wget krb5-devel pam-devel libX11-devel libXt-devel initscripts libXt-devel gtk2-devel lrzsz建立编译目录 mkdir -pv /root/rpm…

22 最长回文子串的3中解决方式

问题描述&#xff1a;给你一个字符串s,找到s中最长的回文子串 暴力求解&#xff1a;通过两个循环遍历所有的子串&#xff0c;找到最长的那个子串并进行记录后返回 Boolean isPalindrome(String s,int indexStart,int indexEnd) { if(indexStartindexEnd) { return true; } in…

使用 TypeChain 从智能合约 ABI 生成类型声明

前言 web3 项目中&#xff0c;前端不可缺少地需要调用智能合约的代码&#xff0c;但是智能合约只有合约地址及对应的 ABI 文档&#xff0c;而没有相应的 typescript 类型声明。本文讲述如何使用 typechain 将智能合约的 ABI 文件自动生成类型声明&#xff0c;这样可以在项目中…

分布式ID服务实践

背景 分布式场景下需要一个全局 ID 来标识唯一性&#xff0c;比如在单数据库时通过表唯一主键即可实现唯一 ID&#xff0c;分库分表时就需要全局唯一 ID。 业务对唯一 ID 的要求如下&#xff1a; 全局唯一性 不能出现重复的 ID 号&#xff0c;既然是唯一标识&#xff0c;这…

Ubuntu22.04LTS配置rsync服务

Ubuntu22.04LTS配置rsync服务 近期准备同步一些文件&#xff0c;准备选用rsync&#xff0c;这里记录一下配置过程。 rsync是一个开源的快速备份工具&#xff0c;可以镜像保存整个目录树和文件系统。 rsync使用所谓的“rsync算法”来使本地和远程的文件保持同步。这个算法只传…

Kubernetes(K8s)安全认证-10

安全认证 访问控制概述 Kubernetes作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。 客户端 在Kubernetes集群中&#xff0c;客户端通常有两类&#xff1a; User Acco…

线程池,及7大参数,4大拒绝策略详解

线程池&#xff0c;及7大参数&#xff0c;4大拒绝策略详解 1. 前言 1.1 什么是线程池&#xff1f; 线程池是一种利用池化技术思想来实现的线程管理技术&#xff0c;主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用…

基于模块化的智能变电站电气系统

摘要 本次设计是我们的毕业设计,本次设计的变电站的类型为地区变电站&#xff0c;是为了满足市区生产和生活的要求&#xff0c;根据老师给出的设计资料和要求&#xff0c;结合所学的基础知识和文献资料所做的。通过本设计&#xff0c;对以前所学的知识加强了理解和掌握&#x…

第19章 正则表达式 - C++

第19.1节 介绍 正则表达式库提供表示正则表达式的类&#xff0c;正则表达式是一种用于在字符串中匹配模式的微型语言。下列数种对象上的操作能刻画几乎所有带正则表达式的操作&#xff1a; 目标序列。为模式而搜索到的字符序列。这可以是二个迭代器所指定的范围、空终止字符串…

【4】密评-网络和通信安全测评

0x01 依据 GB/T 39786 -2021《 信息安全技术 信息系统密码应用基本要求》针对等保三级系统要求&#xff1a; 网络和通信层面&#xff1a; a&#xff09;应采用密码技术对通信实体进行身份鉴别&#xff0c;保证通信实体身份的真实性&#xff1b; b&#xff09;宜采用密码…

Java实现微信小程序支付前后端

微信小程序支付的前后端实现可以分为以下几个步骤&#xff1a; 微信开放平台注册账号并创建小程序应用。 在小程序后台设置支付相关信息&#xff0c;包括支付证书、支付回调地址等。 在小程序前端页面中调用wx.requestPayment函数&#xff0c;调起微信支付界面。 在小程序后…

GB/T 35379-2017 木门分类和通用技术要求

木门是指主要采用实木、人造板或其他木质复合材料制成的门框和门扇&#xff0c;根据表面材料的不同分为实木门&#xff0c;实木复合门和木质复合门&#xff0c;按照功能的不同分为防火木门、防盗木门、防潮木门、隔声木门等。 GB/T 35379-2017 木门检测项目 测试项目 测试标准…

【数电笔记】07-基本和复合逻辑运算

目录 说明&#xff1a; 基本逻辑运算 1. 与运算 &#xff08;and gate&#xff09; 2. 或运算 &#xff08;or gate&#xff09; 3. 非运算 &#xff08;not gate &#xff09; 复合逻辑运算 1. 与非运算&#xff08;nand&#xff09; 2. 或非运算&#xff08;nor&…

提高你的 Python 编程技巧:10个实用技巧

在日常的 Python 编程工作中&#xff0c;掌握一些实用的技巧可以提高你的效率和代码质量。本文将介绍 10 个实用的 Python 技巧&#xff0c;帮助你更好地利用 Python 进行开发。 1. enumerate 在循环中&#xff0c;有时我们需要同时获取元素的索引和值。这时可以使用 enumera…

用 taichi 写个软渲染器

用 taichi 写个软渲染器 What 起点是&#xff1a;可以 setup 一个画布&#xff0c;drawPixel(x, y, color)&#xff0c;然后渲染到 GUI 或者 .png目标是&#xff1a;加载 obj 模型文件和 .tga 贴图文件&#xff0c;并渲染出来使用 taichi 作为 SIMD 加速 backend复现一些 RTR…

leetcode:统计感冒序列的数目【数学题:组合数含逆元模版】

1. 题目截图 2.题目分析 需要把其分为多个段进行填充 长为k的段&#xff0c;从两端往中间填充的方案数有2 ** (k - 1)种 组合数就是选哪几个数填哪几个段即可 3.组合数含逆元模版 MOD 1_000_000_007 MX 100_000# 组合数模板 fac [0] * MX fac[0] 1 for i in range(1, MX…