Flask--session的新应用--当全局变量来用

来源:互联网 发布:协方差矩阵退化 编辑:程序博客网 时间:2024/06/07 09:03

 今天尝试了一个在flask中的session的新用法,我还没有在其他地方看到这种用法;所以记录一下。
心得:
 session就像一个map数据类型对象,有键值对的概念。比如:session[‘data’] = ‘you need it’ 然后在其他的地方就可以直接取出或者直接判断比如:if seesion[‘data’] == ‘you need it’ 用起来很简单。


一、session的通常用法

 session在Flask中通常用做设置某些页面的权限,比如某些页面必须要登录才可以看到,登录的信息或标志就放到session中。它的使用过程如下:

  • (1)在整个flask工程的启动文件中添加app.config['SECRET_KEY'] = 'you never guess'
  • (2)再在使用的py文件中添加from functools import wraps
  • (3)在使用的py文件中添加from flask import session
  • (4)然后写处理函数
  • (5)再在逻辑代码中写已经登录的标志
  • (6)最后在设置限制的视图函数前添加限制函数的修饰器

    主要代码
    启动模块
    main.py

#encoding: utf-8from flask import Flaskfrom main import mainapp = Flask(__name__,              template_folder='templates',  # 指定模板路径,可以是相对路径,也可以是绝对路径。              static_folder='static',  # 指定静态文件前缀,默认静态文件路径同前缀              # static_url_path='/opt/auras/static',     #指定静态文件存放路径。              )app.register_blueprint(main)  # 注册main蓝图,没有指定前缀。app.config['SECRET_KEY'] = 'you never guess' # 使用 session 必须要配置这个,不然会报500错误的!if __name__ == '__main__':    app.run()

在视图模块中
views.py

#encoding: utf-8from flask import render_template,request,session, redirectfrom main import mainfrom functools import wraps#登录、注册认证函数def authorize(fn):    @wraps(fn)    def wrapper(*args, **kwargs): # 这里就像过滤器,有了那个修饰器标志的视图函数都必须经过这个函数才可以返回请求        user = session.get('logged_in',None)#取得登录标志        if user:            return fn(*args, **kwargs)#登录了就返回请求        else:            return '访问该网页需要登录!'#否则就转到注册的页面    return wrapper@main.route('/')@main.route('/home')def index():    print'__name__', __name__    return render_template('main/home.html')#登录用户@main.route('/signin', methods=['GET', 'POST'])def signin():    if request.method == 'GET':        return render_template("user/login.html")    if request.method == 'POST':        u = request.form['username']        p = request.form['password']        if isNameExisted(u):            t = checkPassword(u);#获得数据库存储的hash值            if check_password_hash(t,p):#查询有没有这个用户                session['logged_in'] = True # 登录成功                return redirect('/user/blog')        else:#没有用户就是新用户那么就转入注册页面            return redirect('/register')@main.route('/doc')@authorize       #这个修饰器表示,这个视图页面必须登录才可以访问def blog():    return render_template('user/blog.html')#注销用户@main.route('/signout', methods=['GET', 'POST'])@authorizedef signout():    session['logged_in'] = False # 变成false 就意味着需要重新登录了    return redirect('/home')

二、全局变量的用法

 这也很简单,直接这某个视图函数定义一下,然后就可以在其他的视图函数里面进行使用了。

@main.route('/smartschoolbus/repwd_first', methods=['GET','POST'])def ssb_repwd_first():    if request.method == 'GET':        return render_template('main/ssb_repwd.html')    if request.method == 'POST':        username = request.form['username']        checkcode = request.form['checkcode']        if not isNameExist(username):            return 'nameerror'        elif not isCheckCode(checkcode):            return 'checkcodeerror'        else:            session['repwd_name'] = username # 定义一个session"键"为repwd_name"值"为username里面的值            session['auth_ssb'] = True            return 'success'@main.route('/smartschoolbus/repwd_second', methods=['GET','POST'])@authorizedef ssb_repwd_second():    if request.method == 'GET':        return render_template('main/ssb_repwd_second.html')    if request.method == 'POST':        username = request.form['username']        pwd_temp = hashlib.sha1(request.form['password'])# 哈希加密        password = pwd_temp.hexdigest()# 哈希加密        if not session['repwd_name'] == username: #另一个视图函数里面就可以直接使用了,就如同一个全局函数,很简单            return 'nameerror'        else:            setPassWord(username,password)            session['auth_ssb'] = False            return 'success'