Flask上下文管理

单于经纬
2023-12-01

1.0 上下文介绍

flask中有两个上下文,一个是应用上下文(app),另一个是请求上下文(request)。

  • 应用上下文current_app和请求上下文request 都是一个全局变量,所有请求都是共享的。

  • flask有特殊的机制,可以保证每次请求的数据都是隔离的。所以可以直接导入request对象,也不会被一些脏数据影响,并且不需要在每个函数中使用request的时候,都导入request对象。

  1. request: 请求上下文的对象,一般用来保存请求的变量,如:args、form等。
  2. session:请求上下文的对象,一般用来保存会话信息。
  3. current_app :应用上下文对象,返回当前的app。
print(app)
app2 = current_app
with app.app_context(): #添加上下文,让app2可以打印出来
    print(app2)
  1. g:应用上下文对象,处理请求时用来作临时存储的对象。
@app.route('/')
def login():
    #res = Response('京东网')
    # res.set_cookie('username', 'cheney', max_age=60*60*24)
    # session['username'] = 'jerry'
    # session.permanent = True
    # request.form.get('username')
    # return res
    username = session.get('username')

    g.username = username
    log_a()
    log_b()
    return '这是首页'
    

2.0 常用的钩子函数

  • before_first_request 处理第一次请求之前执行
  • before_request 每次请求之前执行,这个装饰器通常用来给视图函数增加一些变量
  • teardown_appcontext 不管程序是否出错,都会执行
  • context_processor 上下文处理器,返回的字典中的键可以在模板上下文中使用
  • errorhandler:errorhandler接收状态码,可以自定义返回这种状态码的响应的处理方法。
from flask import Flask, render_template

app = Flask(__name__)

#钩子函数

@app.route('/')
def index():
    a = 1/0
    return render_template('index.html')

@app.route('/login/')
def login():

    return render_template('login.html')
#
# @app.before_first_request
# def before():
#     print('这是请求之前第一个执行的函数')
#     return '这是请求之前第一个执行的函数'
#
# @app.before_request
# def be_re():
#     print('---这是请求之前执行的函数---')
#     return '这是请求之前执行的函数'
#
# @app.after_request
# def after_request(ref):
#     print('这是请求之后执行的函数')
#     return ref
#
# @app.teardown_appcontext
# def teardown_app(res):
#     print('不管程序是否出错,都会执行')


@app.context_processor     #上下文处理器
def context_processor():
    return {'username' : 'cheney'}

@app.errorhandler(404)
def errorhandler(res):
    return'您搜索的页面不存在', 404


@app.errorhandler(500)    #自定义状态码响应
def errhand(res):
    return '服务器错误', 500


if __name__== '__main__':
    app.run()
 类似资料: