Flask(中间件与全局变量 九)

    技术2026-06-08  16

    中间件 middleware

    request

    当Flask应用处理请求时,它会根据从WSGI服务器收到的环境创建一个Request对象.

    因为工作者(取决于服务器的线程,进程或者协程)一次只能处理一个请求,所以在该请求期间请求数据可被认为是该工作者的全部数据。

    Flask对此的术语为本地请求

    请求钩子 before_request

    在获取某个请求数据之前,可以做额外的事情。

    场景:运营-数据埋点

    各个接口的访问数量与频次

    @app.before_request def get_num_of_interface():     # 从数据库中读取缓存数量     print("接口访问数量的缓存+1")     # 将缓存数量+1后存入数据库

    场景:验证是否登陆

    @app.before_request def get_num_of_interface():     sign = request.args.get('sign')     if sign != 'admin':         abort(401)

    场景:操作时间大于一定时间后需要重新登陆

    after_request

    response参数必须有

    return 的必须是一个Response对象

    通常用来修改响应

    如果视图出现错误,不会调用

    场景:封装响应信息

    @app.after_request def make_res(response):     response.headers['server'] = 'zx'     print(f'after {request.url}')     return response 响应头修改

    teardown_request

    通常用来释放资源

    不管有没有错误都会调用

    场景:关闭数据库连接

    @app.teardown_request def teardown_make_res(error):     print(error)     print("tear Down")

    before_first_request

    第一次请求的时候触发

    @app.before_first_request def first():     print("第一次请求")

    ## 全局变量

    g:同一个请求中 共享数据

    from flask import g

    场景:验证用户信息

    可以在同一请求之间共享g的内容,相当于实现了这个请求的一个全局变量

    @app.before_request def get_num_of_interface():     sign = request.args.get('sign')     if sign != 'admin':         abort(401)     # 获取sign对于的用户     a = sign + 'md'     g.user = a @app.route('/') def hello_world():     print(g.user)     return 'Hello World!'

    场景:数据库连接

    def connect_to_database():     conn = pymysql.connect(host='127.0.0.1',                            user='root',                            password='123456',                            db='zx',                            charset='utf8mb4')     return conn.cursor() @app.before_request def get_db():     if 'db' not in g:         g.db = connect_to_database() @app.teardown_request def close_db(exception):     db = g.pop('db', None)     if db is not None:         db.close() @app.route('/hi') def hi():     g.db.execute('SELECT * FROM user_info;')     a = g.db.fetchall()     print(a)

    session

    用来记录用户会话信息

    from flask import Flask, session, request app = Flask(__name__) app.config['SECRET_KEY'] = 'sfoowff' @app.route('/') def home():     if not session.get('user'):         return '你没有登陆'     return '这是首页' @app.route('/login/') def login():     username = request.args.get('username')     pwd = request.args.get('pwd')     if username and pwd:         session['user'] = username         return '登陆成功'     return '账号密码不能为空' @app.route('/logout/') def logout():     session.pop('user', None)     return '登出' if __name__ == '__main__':     app.run()

    测试

    http://127.0.0.1:5000/login/?username=zx&pwd=123 登陆

    访问首页

    首页
    Processed: 0.034, SQL: 9