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.创建一个蓝图对象

python 复制代码
user_bp=Blueprint('user',__name__)

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

python 复制代码
@user_bp.route('/')
def user_info():
    return 'user_info模块'

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

python 复制代码
app.register_blueprint(user_bp)

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

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

1.url前缀

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

python 复制代码
app.regist_blueprint(user_bp,url_prefix='/user')

2.蓝图中的静态资源

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

python 复制代码
user_info=Blueprint('user',__name__,static_folder='static_user')

3.蓝图中的模板

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

python 复制代码
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

python 复制代码
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

python 复制代码
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内部会自己加密)

python 复制代码
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: 在每次请求后执行 接受一个参数:错误信息,如果有相关错误抛出

python 复制代码
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)
python 复制代码
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中程序全局的一个临时存储变量,充当中间媒介的作用,我们可通过他对两个文件之间的变量进行传递

python 复制代码
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)

python 复制代码
abort(404)

2.捕获异常

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

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

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

捕获指定异常:

python 复制代码
@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):
return '除数不能为0'

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

相关推荐
hyhrosewind26 分钟前
Python函数基础:说明文档(多行注释),函数嵌套调用,变量作用域(局部,全局,global关键字),综合案例
python·变量作用域·函数说明文档(多行注释)·函数嵌套调用·局部变量和全局变量·函数内修改全局变量·global关键字
一点.点1 小时前
李沐动手深度学习(pycharm中运行笔记)——04.数据预处理
pytorch·笔记·python·深度学习·pycharm·动手深度学习
一点.点1 小时前
李沐动手深度学习(pycharm中运行笔记)——07.自动求导
pytorch·笔记·python·深度学习·pycharm·动手深度学习
Rabbb1 小时前
C# JSON属性排序、比较 Newtonsoft.Json
后端
蓝易云1 小时前
在Linux、CentOS7中设置shell脚本开机自启动服务
前端·后端·centos
一千柯橘1 小时前
Nestjs 解决 request entity too large
javascript·后端
userkang2 小时前
消失的前后端,崛起的智能体
前端·人工智能·后端·ai·硬件工程
大霸王龙2 小时前
Python对比两张CAD图并标记差异的解决方案
python·opencv·计算机视觉
慧一居士2 小时前
Kafka HA集群配置搭建与SpringBoot使用示例总结
spring boot·后端·kafka
萧鼎3 小时前
PDFMathTranslate:让数学公式在PDF翻译中不再痛苦
python·pdf