请求扩展、蓝图、g对象
2022-05-16 21:06
666 查看
今日内容概要
- 请求扩展
- 蓝图
- g对象
内容详细
1、请求扩展
# 在请求来了,请求走了,可以做一些校验和拦截,通过装饰器来实现 7 个 # 1 before_request 类比django中间件中的process_request,在请求收到之前绑定一个函数做一些事情 # 2 after_request # 3 before_first_request # 4 teardown_request # 5 errorhandler # 6 template_global # 7 template_filter
from flask import Flask, request, render_template app = Flask(__name__) # app.debug = True # 1. 请求扩展之before_request,在进入视图函数之前执行,如果有多个,是从上往下执行 @app.before_request def before(): # 判断是否登录,如果登录了继续往下走,如果没登陆 # request.xxx='lqz' 可以往请求中放值,后续可以取出来,只针对于当次请求有效 print("我执行了1111") # @app.before_request # 多个before_request 从上往下 只执行一次 # def before1(): # # 判断是否登录,如果登录了继续往下走,如果没登陆 # print("我执行了2222") # 2. 请求走了,会执行它,注册多个,按照从下往上的顺序执行 @app.after_request def after(response): # 写入cookie,写入响应头。。。处理跨域 print(response) print("请求走了1111") return response # @app.after_request # def after2(response): # print(response) # print("请求走了2222") # return response # 3. before_first_request 只会执行一次,以后就不执行了,跟用户无关,做一些初始化的工作 @app.before_first_request def first(): print("我的第一次") # 4. teardown_request 每一个请求之后绑定一个函数,即使遇到了异常,debug为false的情况下 @app.teardown_request def teardown(e): print(e) # 记录日志,错误日志request.method print("我是teardown") # 5. errorhandler 绑定响应状态码,当状态码一致,就会执行它 @app.errorhandler(404) def err_404(arg): print(arg) return render_template('404.html') @app.errorhandler(500) # 500错误的返回 def err_500(arg): print(arg) return render_template('500.html') # 6. 标签template_global @app.template_global() def add(a1, a2): return a1 + a2 # 7. 过滤器template_filter @app.template_filter() def add2(a1, a2, a3): return a1 + a2 + a3 @app.route('/') def index(): # raise Exception("错误") l = [1, 2, 4] print(l[9]) print("我是视图函数") return "hello web" @app.route("/home") def home(): return render_template('home.html') if __name__ == '__main__': app.run()
2、蓝图
# blueprint 现在项目都是单个py文件--》想划分目录--》自己定制目录结构--》app经常用---》各个文件中导来导去---》出现循环引入问题 # 一个项目有多个app,每个app有自己一套路由,使用蓝图来管理 # 第一步:定义蓝图对象 user = Blueprint('user', __name__) # 第二步:使用蓝图写路径,写请求扩展(只针对于当前蓝图生效) @user.route('/index') # 第三步:把蓝图注册进app中 app.register_blueprint(user) # 小型项目目录划分 pro_flask -pro_flask -__init__.py -statics -templates -views account.py user.py blog.py -run.py # 大型项目 --》有多个app pro_flask -pro_flask # 包 __init__.py # 包的init admin # 包 __init__.py # 包的init static # 自己的静态文件 templates # 自己的模板文件 models.py views.py # 自己的视图函数 web # 包 __init__.py static templates views.py run.py # 启动文件 # 以后如何划分,千奇百怪,但是都使用蓝图来做,蓝图管理自己的路由和请求扩展
3、g对象
# global的缩写,为了实现在同一个请求中,传递数据,上下文传递,赋值取值只针对于当次请求生效 # 类比 django 中的 request对象,内有context 属性 django中间件中,假设想放到request中一个数据 request.name="lqz" rerquest.context['name']='lqz' rerquest.context['method']='nb' 到视图函数中,就可以取出来 # g和session有什么区别? g只针对于当次请求 session针对于多次请求
from flask import Flask, request, g app = Flask(__name__) @app.route('/') def index(): print("我是视图函数") # request.a=1 # request.b=2 # 当次请求中的上下文 g.a = 1 g.b = 3 print(add()) return "hello web" @app.route('/home') def home(): g.a = 3 g.b = 5 print(add()) return "hello home" def add(): return g.a + g.b # return request.a+request.b if __name__ == '__main__': app.run()
相关文章推荐
- 使用OGNL通过请求对象访问bean属性
- ajax处理请求,以JSON数据格式返回,(json时间日期返回时对象---》日期格式)
- 在dva中如何不通过yield发送封装的请求并且获取返回的promise对象中的数据
- C#中DataRow加扩展方式-转为对象
- chapter 8.4: I/O 请求对象
- 1. 抽象工厂模式可以说是简单工厂模式的扩展,它们主要的区别在于需要创建对象的复杂程度上。
- ES6 对象扩展
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。
- javascript语言扩展:可迭代对象(2)
- javascript语言扩展:可迭代对象(5)
- request请求转发,共享数据(域对象)
- 利用原型对原始对象的方法进行扩展(javascript面试题)
- 【Object类型】JavaScript中的原生对象以及Microsoft AJAX Library中的相关扩展
- JS关于对象的安全性之扩展,密封,冻结
- 服务器网站报错:由于扩展配置问题无法提供您请求的页面,请添加MIME映射,针对mp4,flv文件类型无法打开。
- 获取浏览器地址栏get请求的数据并存在一个对象中
- es6对象的扩展
- 实现一个对象验证库系列 -- 3) Fluent以及扩展方法实现 (请大神批评)
- 对象-关系映射文件:映射文件的扩展名为 .hbm.xml
- XAF 字段级权限扩展-根据对象选择属性