Flask上下文与钩子函数

Flask上下文

Flask项目中有两个上下文,一个是应用上下文(app),另一个是请求上下文(request)。请求上下文request和应用上下文current_app都是一个全局变量,所有请求都是共享的。Flask有特殊机制可以保证每次请求的数据都是个离的,即A请求所产生的数据不会影响到B请求。所以可以直接导入request对象,也不会被一些脏数据影响,并且不需要在每个函数中使用request的时候传入request对象,这两个上下文具体的实现方式和原理可以没必要详细了解。

  • request:请求上下文的对象,这个对象一般用来保存一些请求数据的变量,比如method\args\form等
  • session:请求上下文的对象,这个对象一般用来保存一些会话信息。
  • current_app:返回当前的app
  • g:应用上下文的对象,处理请求时用作临时存储的对象。(局部变量)
from flask import Flask, session, request, current_app, g
import os
from datetime import timedelta
from utils import log_a, log_b

@app.route('/')
def index():
    username =session.get('username')
    g.username = username
	log_a()
	log_b()
	hello()
	# print(current_app.config['DEBUG'])
	return "这是首页"

    # 如果另一个方法也要调用 可以直接用g对象
def hello():
    print('hello %s' % g.username)

utils文件:


# utils 工具文件 生成24位的字符串  发送验证码

# def log_a(username):
#     print("log a %s" % username)
#
# def log_b(username):
#     print("log b %s" % username)

from flask import g

def log_a():
    print("log a %s" % g.username)

def log_b():
    print("log b %s" % g.username)

钩子函数

  • before_first_request:处理第一次请求之前执行。先执行它 在执行首页。

@app.before_request
def before_request():
	if not hasattr(g.'user'):
		setatter(g.'user', 'xxx')
  • teardown_appcontext:不管是否异常,注册的函数都会在每次请求之后执行
@app.teardown_appcontext
def teardown(response):
	print("teardown 被执行")
	return response
  • context_processor:上下文处理器。返回的字典值的键可以在模板上下文中使用
@app.context_processor
def context_processoor():
 return ('current_user': 'xxxx')

errorhander: 接受状态码,可以自定义返回这种状态码的响应处理方式。

@app.reeorhander(404)
def page_not_found('error'):
	return "This page does notexist",404
执行代码

先是第一次 然后是每次 最后是首页!

@app.route("/")
def index():
    print("这是首页")
    return "这是首页"

@app.before_first_request
def handle_first_request():
    print("这是第一次请求之前执行的")

@app.before_request
def handle_before():
    print("每次请求之前被执行的")

顺序为:这是第一次请求之前执行的
每次请求之前被执行的
这是首页
每次请求之后被执行的

@app.after_request
def handle_after(response):
    print("每次请求之后被执行的")
    return response

打印顺序:同上,handle_teardown被执行----在最后

@app.teardown_appcontext
def handle_teardown(response):
    print("handle_teardown被执行")
    return response

上下文处理器:

@app.route("/")
def index():
    print("这是首页")
    # , username='happy'
    return render_template("index.html")
    # return "这是首页"

@app.route("/list/")
def list():
    # , username='happy'
    return render_template("list.html")

@app.context_processor
def context():
    return {"username": "lllggg"}

错误代码处理

@app.route("/")
def index():
    # 1/0
    abort(500)
    print("这是首页")
    # , username='happy'
    return render_template("index.html")
    # return "这是首页"


@app.errorhandler(404)
def page_not_find(error):
    return render_template("404.html"), 404
    # return "页面不存在"

@app.errorhandler(500)
def server_error(error):
    return "服务器内部错误", 500
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值