请求扩展、蓝图、g对象

今日内容概要

  • 请求扩展
  • 蓝图
  • 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()
posted @ 2022-05-16 21:06  Deity_JGX  阅读(77)  评论(0编辑  收藏  举报