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

目录

一:蓝图

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 respif __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 respif __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,sessionapp=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,abortapp=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,gapp=Flask(__name__)def db_query():user_id=g.user_iduser_name=g.user_nameprint(user_name,user_id)@app.route('/')
def get_user():g.user_id=123g.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.mzph.cn/web/26286.shtml

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

相关文章

【Linux】进程控制2——进程等待(waitwaitpid)

1. 进程等待必要性 我们知道,子进程退出,父进程如果不管不顾,就可能造成"僵尸进程”的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为…

香港户口需要什么条件?有学历要求吗?最新香港落户途径详解!

香港户口需要什么条件?有学历要求吗?最新香港落户途径详解! 由于香港放开“落户”窗口,想去香港发展或者想拿香港身份的朋友都想抓住这个机会赶紧申请。 只是,香港户口办理是有条件的,而且有学历要求&…

2024年上海高考作文题目(ChatGPT版)

一、2024年6月7日上海高考作文题目 生活中,人们常用认可度判别事物,区分高下。请写一篇文章,谈谈你对“认可度”的认识和思考。 要求:(1)自拟题目;(2)不少于800字。 二、…

Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena阅读笔记

使用 MT-Bench 和 Chatbot Arena 评估 LLM 作为评审的效果 Lianmin Zheng1∗ Wei-Lin Chiang1∗ Ying Sheng4∗ Siyuan Zhuang1 Zhanghao Wu1 Yonghao Zhuang3 Zi Lin2 Zhuohan Li1 Dacheng Li13 Eric P. Xing35 Hao Zhang12 Joseph E. Gonzalez1 Ion Stoica1 1 UC Berkele…

VScode中连接并使用docker容器

前提条件: 1.在windows下安装Docker Desktop(方法可见下面的教程) Docker Desktop 安装使用教程-CSDN博客 2.在vscode安装3个必备的插件 3.先在ubuntu中把docker构建然后运行 4.打开vscode,按下图顺序操作 调试好之后上传到git上,然后后面…

《人人都是产品经理》笔记1:什么是产品?怎么入行?

《人人都是产品经理》笔记1:什么是产品?怎么入行? 产品是什么?产品经理、产品管理?真的想做产品经理吗?全书结构示意图 从写这篇文章开始,是个人第二次对该书进行阅读,在此进行个人的…

[Python学习篇] Python输入

关键字 input 语法:input("提示信息") 特点 当程序执行到input,等待用户输入,输入完成之后才能继续向下执行。input接收用户输入后,一般存储到变量中,方便使用。input会把接收到的任意用户输入的数据都当做…

老杨说运维 | 基于数据驱动的智观能力建设(文末附现场视频)

本期回顾来自擎创科技创始人兼CEO杨辰的现场演讲 青城山脚下的滔滔江水奔涌而过,承载着擎创一往无前的势头,共同去向未来。2024年6月,双态IT成都用户大会擎创科技“数智化可观测赋能双态运维”专场迎来了完满的收尾。 “没有2200年前李冰率众…

Java集合自测题

文章目录 一、说说 List , Set , Map 三者的区别?二、List , Set , Map 在 Java 中分别由哪些对应的实现类?底层的数据结构?三、有哪些集合是线程不安全的?怎么解决呢?四、HashMap 查询,删除的时间复杂度五…

word怎么单页横向设置(页码不连续版)

打开word,将光标放在第一页的最后位置。 然后点击布局下的分隔符,选择下一页。 将光标放在第二页的开头,点击布局下的纸张方向,选择横向即可。 效果展示。 PS:如果那一页夹在两页中间,那么在…

Python发送Outlook邮件的步骤流程有哪些?

Python发送Outlook邮件的技巧?如何使用Python发信? 在Python中使用SMTP协议发送邮件到Outlook邮箱是一项常见的任务。AokSend将介绍如何通过Python编程语言实现这一过程,从准备工作到实际发送邮件的具体步骤。 Python发送Outlook邮件&#…

构建汛期智慧水利新生态:EasyCVR视频汇聚监控综合管理方案解析

一、项目背景与目标 随着我国水利事业的不断发展,水利设施的管理与维护工作愈发重要。随着夏季汛期的到来,水利管理工作面临着巨大的挑战。为确保水利设施的安全运行,及时应对可能出现的汛情,建设一套高效、智能的视频监控可视化…

wms海外仓系统排名分析:哪个才更适合中小海外仓

对中小型海外仓来说,想在竞争激烈的市场下生存,关键就在于是否能改变自己落后的仓储管理模式,提升客户满意度和业务流畅度。 wms海外仓系统作为这一领域的关键工具,可以说在很大程度上决定了海外仓的业务标准化程度发展。不过现在…

MFC为什么说文档在数据的保存和给用户提供数据之间划分了清晰的界限?

MFC MFC(Microsoft Foundation Classes)是微软为Windows应用程序开发提供的一套C类库,它在设计上强调了"文档-视图"(Document-View)架构。这种架构将文档(Document)与用户界面&#…

六西格玛培训都培训哪些内容 ?

天行健六西格玛培训的内容通常涵盖多个方面,旨在帮助学员全面理解和应用六西格玛管理方法。以下是详细的培训内容概述: 一、六西格玛基础知识 引入六西格玛的概念、原理和历史,包括DMAIC(定义、测量、分析、改进、控制&#xff0…

辗转相除法求最大公约数

辗转相除法求最大公约数 两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。 点我跳转参考链接 算法实现: int gcd(int a, int b) {return b 0 ? a …

新需求:实现一个自动运维部署工具

如何构建一个高效、可靠的自动运维部署工具,以下是具体的需求情况,希望有朋友可以指点一下,有报酬的哦! 一、项目描述 本项目旨在构建一个端到端的自动化运维部署解决方案,整合SpringBoot后端服务、Vue3前端应用、Do…

方法分享 |公网IP怎么指定非433端口实现https访问

公网IP可以通过指定非443端口实现HTTPS访问。在网络配置中,虽然HTTPS协议默认使用443端口,但没有规定不能在其他端口上实施HTTPS服务。使用非标准端口进行HTTPS通信需要正确配置服务器和SSL证书,并确保客户端能够连接到指定的端口。下面说明如…

本地生活服务电商平台小程序源码系统 含完整的安装代码包+搭建教程

系统概述 本地生活服务电商平台小程序源码系统,是一款集成了商品展示、在线交易、服务预约、优惠券发放、会员管理、订单处理、即时通讯等多种功能于一体的综合性解决方案。它旨在为本地商家提供一个高效、便捷的线上经营平台,同时为消费者带来流畅的使…

⌈ 传知代码 ⌋ MonoCon解读与复现

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…