flask web学习之flask与http(一)

news2024/11/24 12:43:45

文章目录

      • 一、请求响应循环
      • 二、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.coloradmin.cn/o/1288073.html

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

相关文章

Linux【缓冲区】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;缓冲区是什么&#xff1f;为…

23、pytest通过skip跳过测试用例

官方实例 # content of test_skip.py import pytest import syspytest.mark.skip(reason"no way of currently testing this") def test_the_unknown():passdef valid_config():return Falsedef test_function():if not valid_config():pytest.skip("unsupport…

毕业论文及各种办公文件word页码的设置大全

当我们在写论文或者报告的时候&#xff0c;经常需要我们给文档设置页码&#xff0c;用于页码统计&#xff0c;也方便后期的查阅和阅读&#xff0c;但是经常遇到特殊的要求或者情况&#xff0c;比如删除了某个页的页码&#xff0c;那么整个文档目录的页码就会全部被删除&#xf…

Retrofit的转换器

一、前言 1.为什么要使用Retrofit转换器 在我们接受到服务器的响应后&#xff0c;目前无论是OkHttp还是Retrofit都只能接收到String字符串类型的数据&#xff0c;在实际开发中&#xff0c;我们经常需要对字符串进行解析将其转变为一个JavaBean对象&#xff0c;比如服务器响应…

【计算机网络笔记】物理层——信道与信道容量

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

静态VS动态代理IP:对比静态和动态代理IP的区别,如何选择?

在现代网络环境中&#xff0c;代理IP的作用不容小觑。它作为一种有效的网络工具&#xff0c;帮助用户在网上保持匿名性&#xff0c;同时还能绕过地理限制、提高安全性和增强数据收集的能力 在众多类型的代理IP中&#xff0c;静态和动态代理IP是最常见的两种形式。下面我们深入…

网络模拟与网络仿真

目录 一、概念界定 二、模拟&#xff08;simulation&#xff09;与仿真&#xff08;emulation&#xff09; 2.1 模拟&#xff08;simulation&#xff09; 2.2 仿真&#xff08;emulation&#xff09; 2.3 区分 三、网络模拟与网络仿真 3.1 网络模拟 3.2 网络仿真 3.…

properties出现中文乱码解决方法(万能)

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 在使用Properties类的时候,中文出现乱码 如图所示: 正常思维来讲,估计是中文编码有问题,于是我将其改为UTF-8的编码方式 通过下方的改动: 可到了这一步,中文还是乱码(这一步改成功的网友可自动立场,没改成功的网…

持续集成交付CICD:Sonarqube 扫描本地项目(关联Gitlab项目与Jenkins流水线)

目录 一、实验 1.Java项目扫描 2.视图徽章 3.版本管理 一、实验 1.Java项目扫描 &#xff08;1&#xff09;指定项目信息关联的首页为GitLab项目&#xff0c;持续集成为Jenkins流水线 &#xff08;2&#xff09;命令行 sonar-scanner -Dsonar.host.urlhttp://192.168.20…

【算法】算法题-20231206

这里写目录标题 一、非自身以外数字的乘积二、最大数三、奇数排序 一、非自身以外数字的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀…

在eclipse中安装python插件:PyDev

在eclipse中安装插件PyDev&#xff0c;就可以在eclipse中开发python了。 PyDev的官网&#xff1a;https://www.pydev.org/ 不过可以直接在eclipse中用Marketplace安装&#xff08;备注&#xff1a;有可能一次安装不成功&#xff0c;是因为下载太慢了&#xff0c;多试几次&…

极简模式,助力宏观数据监控

随着UWA GOT Online采样的参数越来越多样化&#xff0c;为了提升开发者的使用体验&#xff0c;我们最新推出了三种预设数据采集方案&#xff1a;极简模式、CPU模式、内存模式。该更新旨在降低多数据采集对数据准确性的干扰&#xff0c;同时也为大家提供更精准且有针对性的数据指…

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器安装Bolo开源博客

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…

微软NativeApi-NtQuerySystemInformation

微软有一个比较实用的Native接口&#xff1a;NtQuerySystemInformation&#xff0c;具体可以参考微软msdn官方文档&#xff1a;NtQuerySystemInformation&#xff0c; 是一个系统函数&#xff0c;用于收集特定于所提供的指定种类的系统信息。ProcessHacker等工具使用NtQuerySys…

HarmonyOS学习--TypeScript语言学习(二)

本章目录如下&#xff1a; 一、基础类型 二、运算符 三、变量声明 四、类型断言 五、类型推断 TypeScript支持一些基础的数据类型&#xff0c;如布尔型、数组、字符串等&#xff0c;下文举例几个较为常用的数据类型&#xff0c;我们来了解下他们的基本使用。 关于let 我们…

python爬虫混肴DES案例:某影视大数据平台

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行atob(‘aHR0cHM6Ly93d3cuZW5kYXRhLmNvbS5jbi9Cb3hPZmZpY2UvQk8vTW9udGgvb25lTW9udGguaHRtbA’…

模拟电路学习笔记(一)之芯片篇(持续更新)

模拟电路学习笔记&#xff08;一&#xff09;之芯片篇&#xff08;持续更新&#xff09; 1.CD4047BE芯片 CD4047是一种包含高电压的多谐振荡器&#xff0c;该器件的操作可以在两种模式下完成&#xff0c;分别是单稳态和非稳态。CD4047需要一个外部电阻器和电容器来决定单稳态…

FL Studio中如何录音的技巧,让你的声音更加出众哦!

​ Hey小伙伴们&#xff01;今天我要和大家分享一下在FL Studio中如何录音的技巧&#xff0c;让你的声音更加出众哦&#xff01; 编曲软件FL Studio 即“Fruity Loops Studio ”&#xff0c;也就是众所熟知的水果软件&#xff0c; 全能音乐制作环境或数字音频工作站&#xff0…

一位半加法器,一位全加器,四位全加器

我们这里的加法器只考虑一位的情况。 当我们两个一位相加的话&#xff0c;那么就有两个输入&#xff0c;两个输出&#xff0c;两个输入很好理解&#xff0c;就是两个个位上的数字&#xff0c;0或者是1&#xff0c;那么为什么需要有有个输出呢&#xff1f;难道不是输出一个数就…

系统运维安全之病毒自检及防护

一、前言 Linux勒索病毒&#xff08;Linux ransomware&#xff09;是一种最令人恶心的计算机恶意病毒&#xff0c;它以侵入Linux系统&#xff0c;捆绑文件并要求支付赎金才能释放文件为主要目的&#xff0c;破坏用户的数据&#xff0c;造成数据讹诈。Linux勒索病毒它们的存在已…