flask基础3-蓝图-cookie-钩函数-flask上下文-异常处理

news2024/11/21 2:29:20

目录

一:蓝图

1.蓝图介绍

2.使用步骤

3.蓝图中的静态资源和模板

二.cookie和session

1.cookie

2.flask中操作cookie

3.session

4.session操作步骤

三.请求钩子

 四.flask上下文

1.介绍

2.请求上下文:

3.应用上下文

3.g对象

五:异常处理

1.abort方法

2.捕获异常


 

flask基础1

 flask基础2

一:蓝图

1.蓝图介绍

在Flask中,使用蓝图Blueprint来分模块组织管理。 蓝图实际可以理解为是一个存储一组视图方法的容器对象,其具有如下特点:

一个应用可以具有多个Blueprint

可以将一个Blueprint注册到任何一个未使用的URL下比如 “/user”、“/goods”

Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和 函数的

在一个应用初始化时,就应该要注册需要使用的Blueprint

但是一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。

2.使用步骤

1.创建一个蓝图对象

user_bp=Blueprint('user',__name__)

2.在这个蓝图上注册路由,指定静态文件,注册模板过滤器

@user_bp.route('/')
def user_info():
    return 'user_info模块'

3.在应用对象上注册这个蓝图对象

app.register_blueprint(user_bp)

总的来说蓝图是为了防止一个py文件中写了很多路由,不方便管理,所有我们要对这个应用进行模块化,而蓝图正好可以解决这一点

3.蓝图中的静态资源和模板

1.url前缀

指定蓝图中定义的url前缀,在应用中注册的时候使用url_prefix参数指定,加上这个以后再访问这个蓝图中的url的时候要加上这个前缀

app.regist_blueprint(user_bp,url_prefix='/user')

2.蓝图中的静态资源

再应用中,应用会自动去找项目中默认的静态资源static,而蓝图不同,蓝图对象再创建的时候不会默认注册静态目录的路由,需要我们再创建时指定static_folder参数。

user_info=Blueprint('user',__name__,static_folder='static_user')

3.蓝图中的模板

蓝图对象默认的模板目录为系统的模版目录,可以在创建蓝图对象时使用 template_folder 关键字参数设置模板目录

user_info=Blueprint('user',__name__,template_folder='user_templates')

二.cookie和session

1.cookie

Cookie是一段不超过4KB的小型文本数据,保存在客户端浏览器中,由一个名称(Name)、一个值(Value)和 其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。其中 :

(1) Name/Value:设置Cookie的名称及相对应的值,对于认证Cookie,Value值包括Web服务器所提供的访问令 牌。

(2) Expires属性:设置Cookie的生存期。有两种存储类型的Cookie:会话性与持久性。Expires属性缺省时,为会 话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至 生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效 。

(3) Path属性:定义了Web站点上可以访问该Cookie的目录 。

(4) Domain属性:指定了可以访问该 Cookie 的 Web 站点或域。

2.flask中操作cookie

from flask import Flask
from flask import make_response
app=Flask(__name__)

@app.route('/cookie')
def set_cookie():
    resp=make_response('hello zhangsan')
    # 参数:第一个就是cookie中的一个名称,第二个是值,第三哥关键字代表生存期为3600秒
    resp.set_cookie('username','zhangsan',max_age=3600)
    return resp

if __name__ == '__main__':
    # 运行这个应用后访问/cookie这个地址就后生成一个cookie信息
    app.run(debug=True)

 读取cookie和删除cookie

from flask import Flask, request
from flask import make_response
app=Flask(__name__)

@app.route('/cookie')
def set_cookie():
    resp=make_response('hello zhangsan')
    # 参数:第一个就是cookie中一个值的键,第二个是值,第三哥关键字代表生存期为3600秒
    resp.set_cookie('username','zhangsan',max_age=3600)
    return resp

# 获得cookie
@app.route('/get_cookie')
def get_cookie():
    # 先使用上面那个路由访问/cookie后设置好cookie
    # 在访问这个地址/get_cookie就可以得到cookie了
    resp=request.cookies.get('username')
    return resp

# 删除cookie
@app.route('/delete_cookie')
def delete_cookie():
    # 先使用上面那个路由访问/cookie后设置好cookie
    # 在访问这个/delete_cookie就可以将前面设置的cookie删除
    resp=make_response('hello zhangsan')
    resp.delete_cookie('username')
    return resp


if __name__ == '__main__':
    # 运行这个应用后访问/cookie这个地址就后生成一个cookie信息
    app.run(debug=True)

3.session

Session:与cookie功能效果相同。Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客 户端的。

当访问服务器某个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟 浏览器关联在一起的。这个浏览器指的是浏览器窗口,或者是浏览器的子窗口,意思就是,只允许当前这个 session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录 session的话,就会再启一个属于自己的session。

 session与cookie的联动

当客户端进行第一次请求时,客户端的HTTP request(cookie为空)到服务端,服务端创建session,视图函数根 据form表单填写session,请求结束时,session内容填写入response的cookie中并返回给客户端,客户端的 cookie中便保存了用户的数据。

当同一客户端再次请求时, 客户端的HTTP request中cookie已经携带数据,此时cookies不为空, 获取cookie的有 效时长,如果cookie依然有效,通过与写入时同样的签名算法将cookie中的值解密出来,若cookie已经失效,则返 回空。 再根据解密出来的内容判断服务器中是否存在对应的值。

注意:在Flask中Session的签名算法是:HMAC 和 SHA1算法

4.session操作步骤

需要先设置密钥SECRET_KEY(自己定义的,flask内部会自己加密)

from flask import Flask,session

app=Flask(__name__)

# 设置密钥
class DefaultPas(object):
    SECRET_KEY='zhangsan is a fawaikuangtu'

app.config.from_object(DefaultPas)

@app.route('/set_session')
def set_session():
    session['username']='zhangsan'
    return '设置成功'

# 读取session
@app.route('/get_session')
def get_session():
    username=session.get('username')
    return username

三.请求钩子

钩子就是钩子函数,在flask中使用装饰器实现,这些装饰器会在某一次请求的各个阶段启动,请求之前,请求之后等等。

before_first_request:在处理第一个请求前执行(比如数据库连接是否正常)(新版本flask已经移除)

before_request:每一次请求前执行(比如有没有这个请求的权力)

after_request:如果没有抛出错误,在每次请求后执行 接受一个参数:视图函数作出的响应 在此函数中可以对响应值在返回之前做最后一步修改处理 需要将参数中的响应在此参数中进行返回

teardown_request: 在每次请求后执行 接受一个参数:错误信息,如果有相关错误抛出

from flask import Flask,abort

app=Flask(__name__)

# 这个方法flask新版本中已经移除
# # 在第一次之前调用
# @app.before_first_request
# def before_first_request():
#     print("准备执行第一次请求了")

# 在每一次请求之前调用,这时候已经有请求了,可能在这个方法里面做请求的校验
# 如果请求的校验不成功,可以直接在此方法中进行响应,直接return之后那么就不会执行视图函数
@app.before_request
def before_request():
    print('每一次请求之前')
    # if '这一次请求的权限不够'
    #     return '滚一边去'

# 在执行完视图函数之后会调用,并且会把视图函数所生成的响应传入,可以在此方法中对响应做最后一步统一的处理
@app.after_request
def after_request(response):
    print('这个视图函数已经执行完拉')
    return response

# 请每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息
@app.teardown_request
def teardown_request(response):
    print("本次服务结束")

@app.route('/')
def index():
    return 'index'

if __name__ == '__main__':
    app.run(debug=True)
127.0.0.1 - - [13/Jun/2024 13:42:55] "GET / HTTP/1.1" 200 -
每一次请求之前
这个视图函数已经执行完拉
本次服务结束
每一次请求之前
这个视图函数已经执行完拉
本次服务结束
127.0.0.1 - - [13/Jun/2024 13:42:55] "GET / HTTP/1.1" 200 -

 四.flask上下文

1.介绍

上下文:即语境,语意,在程序中可以理解为在代码执行到某一时刻时,根据之前代码所做的操作以及下文即将要 执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以完成的事情。

Flask中有两种上下文,请求上下文和应用上下文

Flask中上下文对象:相当于一个容器,保存了 Flask 程序运行过程中的一些信息。

2.请求上下文:

在两个文件中,我们如何获取另外一个文件中的请求方式,请求地址,cookie呢?

在flask中,可以直接在视图函数中使用request这个对象进行获取相关数据,而request就是请求上下文的对象,保存了当前本次请求的相关数据,请求上下文对象有:request,session

request:封装了HTTP请求的内容,针对的是http请求,比如user=request.get('user')

session:用来记录请求会话中的信息,针对的是用户信息,比如session['name']=user.id可以记录用户信息,还可以通过session.get('name')获取用户信息

3.应用上下文

它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓 local proxy。它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。

应用上下文对象有:current_app,g

current_app:应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前的app名称,也可以在current_app中存储一些变量

应用的启动脚本是哪个文件,启动时指定了哪些参数

加载了哪些配置文件,导入了哪些配置

连了哪个数据库

有哪些public的工具类、常量

应用跑再哪个机器上,IP多少,内存多大

current_app就是当前运行的flask app,在代码不方便直接操作flask的app对象时,可以操作current_app就等价于操作flask app对象

3.g对象

g作为flask中程序全局的一个临时存储变量,充当中间媒介的作用,我们可通过他对两个文件之间的变量进行传递

from flask import Flask,g

app=Flask(__name__)

def db_query():
    user_id=g.user_id
    user_name=g.user_name
    print(user_name,user_id)
    
@app.route('/')
def get_user():
    g.user_id=123
    g.user_name='zhangsan'
    db_query()
    return '可看到函数db_query中打印的就是我们这里定义的'

五:异常处理

1.abort方法

它可以抛出一个给定状态码的HTTPException或者指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用abort(404)

abort(404)

2.捕获异常

 errorhandler 装饰器 :注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法

参数: code_or_exception – HTTP的错误状态码或指定异常

@app.errorhandler(500)
def go_where(e):
    return '这个服务器已经搬去别的地方了'

捕获指定异常:

@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):
return '除数不能为0'

都看到这里,点个赞在走呗!!!

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

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

相关文章

怕怕怕怕怕怕怕怕怕怕

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

基于Pytorch实现AI写藏头诗

网上你找了一圈发现开源的代码不是付费订阅就是代码有问题,基于Pytorch实现AI写藏头诗看我这篇就够了。 用到的工具:华为云ModelArts平台的notebook/Pycharm/Vscode都行。 镜像:pytorch1.8-cuda10.2-cudnn7-ubuntu18.04,有GPU优先使用GPU资源。 实验背景 在短时测试使用场…

自动控制理论实验---IDFT和FFT算法的原理和MATLAB编程

1、实验设备 PC计算机1台,MATLAB软件1套。 2、实验目的 掌握IDFT(逆离散傅里叶变换)算法的原理和MATLAB编程方法。了解FFT(快速傅里叶变换)算法,并能够调用MATLAB的fft函数进行频域变换。验证IDFT程序的…

ChatGPT:自然语言处理的新纪元与OpenAI的深度融合

随着人工智能技术的蓬勃发展,自然语言处理(NLP)领域取得了显著的进步。OpenAI作为这一领域的领军者,以其卓越的技术实力和创新能力,不断推动着NLP领域向前发展。其中ChatGPT作为OpenAI的重要成果更是在全球范围内引起了…

Day01 数据结构概述

目录 一、数据结构概述 1、基本概念 2、数据结构 3、逻辑关系(线性结构&非线性结构) 4、物理结构(存储结构) 5、算法 6、算法特征 二、时空复杂度 1、时间复杂度 2、空间复杂度 3、结构类型 一、数据结构概述 1、…

【FPGA项目】bin文件ram存取回环测试

🎉欢迎来到FPGA专栏~bin文件ram存取回环测试 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒🍹 ✨博客主页:小夏与酒的博客 🎈该系列文章专栏:FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大…

据说可以防静电和浪涌的P6KE30CA

公司有些变送器之前在最后一道校准时,经常发生烧毁的情况。所以在电路的防反接的M7二极管前面又增加了一个TVS二极管,型号P6KE30CA。但愿加了这个好使把。今天又研究了一下这个TVS管子,把搜索到的东西记录一下。放这里备忘把,忘记…

C语言| 把数组a赋给数组b

把数组a赋给数组b, 正确的写法是用for循环&#xff0c;将数组a中的元素一个一个赋给数组b的元素。 #include <stdio.h> int main(void) { int a[5] {11, 22, 33, 44, 55}; int b[5]; int i; for(i0; i<5; i) { b[i] a[i]; printf(…

Java开发工具的下载

Java开发工具的下载 IDEA概述 IDEA全称InteliJ IDEA&#xff0c;是用于Java语言开发的集成环境&#xff0c;它是业界公认的目前用于Java程序开发最 好的工具。 集成环境 把代码编写&#xff0c;编译&#xff0c;执行&#xff0c;调试等多种功能综合到一起的开发工具。 让我…

证照之星是一款很受欢迎的证件照制作软件

证照之星是一款很受欢迎的证件照制作软件&#xff0c;证照之星可以为用户提供“照片旋转、裁切、调色、背景处理”等功能&#xff0c;满足用户对证件照制作的基本需求。本站证照之星下载专题为大家提供了证照之星电脑版、安卓版、个人免费版等多个版本客户端资源&#xff0c;此…

IEC61850 调试工具 工程师必备

文章目录 IEC61850 调试工具 工程师必备主要功能软件截图 IEC61850 调试工具 工程师必备 下载地址&#xff1a;http://www.redisant.cn/iec61850client IEC 61850 是国际电工委员会&#xff08;IEC&#xff09;制定的一项国际标准&#xff0c;主要用于电力系统自动化领域&…

后端跨域问题的处理

问题描述 在做前后端分离的项目时&#xff0c;很有可能会遇到这样一种情况&#xff1a; 就是在游览器中请求后端的接口&#xff0c;出现了 CORS error 错误 报错信息如下&#xff1a; Access to XMLHttpRequest at http://localhost:8860/user/auth/login from origin http:…

常见的 EVM 版本以及它们的区别

EVM&#xff08;以太坊虚拟机&#xff09;版本的演进是为了引入新的特性和改进以太坊平台的安全性、效率和功能性。每个版本通常伴随着以太坊网络的硬分叉&#xff0c;这是以太坊协议的重大升级。以下是一些常见的EVM版本及其主要区别&#xff1a; Homestead (2016年3月)&…

图像生成新篇章:Stable Diffusion 3 Medium开源评析

摘要 在数字艺术与人工智能的交汇点上&#xff0c;Stable Diffusion 3&#xff08;SD3&#xff09;的开源无疑是一场技术革新的盛宴。就在3月份&#xff0c;我撰写了一篇博文&#xff0c;深入探讨了SD3的技术报告内容与介绍&#xff0c;文章发表在CSDN博客上&#xff0c;https:…

同城如何异地共享文件?

在现代社会中&#xff0c;跨地区的合作变得越来越普遍&#xff0c;而这也带来了共享文件的需求。当我们身处不同的城市&#xff0c;如何高效地共享文件已经成为一项迫切的需求。本文将介绍一种名为“同城异地共享文件”的解决方案&#xff0c;帮助解决这一问题。 2. 天联组网—…

Day02 顺序表

目录 1、顺序表 2、随机访问&顺序访问 3、思考 4、顺序表的封装 1、顺序表 数组在数据结构中是属于线性表的一种&#xff0c;线性表是由一组具有n个相同类型的数据元素组成的。线性表中的任何一个数据元素 有且只有一个直接前驱有且只有一个直接后继首元素是没有前驱的…

学习Java中的Future类

学习Java中的Future类 Future接口在Java 5中引入&#xff0c;作为java.util.concurrent包的一部分。它代表一个异步计算的结果&#xff0c;当计算完成时可以通过Future对象获取结果。Future对象提供了一些方法来检查任务是否完成、等待任务完成并获取任务结果、取消任务等。 …

【python】tkinter编程三大布局管理器pack、grid、place应用实战解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

leetcode240 搜索二维矩阵II

题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18…

redis序列化

文章目录 1、为什么要进行序列化操作&#xff1f;2、序列化方式2.1、自定义序列化2. 2、StringRedisTemplate&#xff08;重点&#xff09; 1、为什么要进行序列化操作&#xff1f; 不进行序列化向redis存入数据代码&#xff1a; SpringBootTest class RedisDemoApplicationT…