flask(十六)----全局变量之request,g,session,cookie,current_app等

目录

reqeust:请求钩子

g: g变量,不可跨请求

session:可以跨请求

current_app:


reqeust:请求钩子

        @app.before_first_request

        @app.before_requset:一个app可以定义多个before_request,从上往下执行。

        @app.after_request

        @app.teardown_request

from flask import Flask

app = Flask(__name__)


@app.before_first_request
def first_action():
    # 服务第一次要做的事情,第一次完成后,后续不再执行
    # 例如设置某些全局变量
    print('设置全局变量')

# 数据埋点
@app.before_request
def get_visit_num():
    # 1。一个请求发起之前的操作,比如链接数据库,查询某个接口的访问数量
    # 2。访问该接口
    # 3。接口数量+1
    # 4。不可使用return,使用了就会中断,一般用来设置
    print('访问数量+1')
    
@app.after_request
def make_res(response):
    # 请求之后的操作,比如修改响应中的headers信息,当respose错误时,就不会触发
    response.headers['server'] = 'chuntian'
    
@app.teardown_request
def tear_down_action():
    # 无论response是否错误,都会执行,比如中断数据库链接
    print('中断数据库链接')
    
    

g: g变量,不可跨请求

        g变量的作用:在同一个请求中共享数据,可以将g变量理解为一个对象,对对象的操作或访问通过g.xxx。

        共享用户信息

from flask import Flask, request, g

app = Flask(__name__)

@app.before_request
def get_visit_num():
    token = request.args.get('token')
    g.user = token + 'md5'      # 此时g.user可以在@app.after_request中获取到

@app.after_request
def make_res():
    print(g.user)

        共享数据库连接:对数据库的操作

import pymysql as pymysql
from flask import Flask, g

app = Flask(__name__)

def db_connect():
    conn = pymysql.connect(
                            host='localhost',
                            user='root',
                            password='123456',
                            db='tasks',
                            port=3306,
                            charset='utf8mb4'
                        )
    return conn.cursor()

@app.before_request
def get_db():
    if 'db' not in g:
        # 把游标cursor存到g变量的db属性中
        g.db = db_connect()

@app.teardown_request
def close_db():
    db = g.pop('db', None)
    if db is not None:
        db.close()
        
@app.route('/register',methods=['GET','POST'])
def register():
    sql = 'select * from tasks where id =xxx;'
    g.db.excute(sql)
    # 通过cursor可使用fetchone()/fetchall()方法获取数据
    data = g.db.fetchall()
    print(data)

session:可以跨请求

import os
from flask import Flask, request, session

app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)

@app.route('/login')
def login():
    username = request.args.get('user')
    pwd = request.args.get('pwd')
    if username and pwd:
        session['auth'] = username
        return '登录成功'
    return '未登录'

@app.route('/')
def index():
    if not session.get('auth'):
        return '尚未登录'
    return '这是首页'

@app.route('/logout')
def logout():
    if session.get('auth'):
        session.pop('auth',None)
    return '登出'

if __name__ == '__main__':
    app.run(debug=True)

效果:

session.permanent=True:设置才有过期时间,否则浏览器关闭就过期。 

current_app:

        当我们想从app之外的地方去访问app的一些属性和资源,可以使用current_app.xxx去访问,例如:current_app.config可以访问app.config的属性数据,而且current_app还具有线程隔离的作用,不会在多线程访问app时出现数据紊乱的问题。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chuntian_tester

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值