flask 使用before_request() 进行用户登录验证

flask 用户登录验证
说到falsk用户登录,一般情况下。有两种方法,

第一种方法

#创建一个登录验证的方法,判断session中有没有username这个键值,如果没有,就返回到登录页面,让用户进行登录

  
def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if 'username' not in session:
            return redirect(url_for('check_login'))
        return f(*args, **kwargs)

    return decorated_function


#创建一个用户登录连接, 当用户登录成功后,在session中,加入username这么键值
@app.route('/login', methods=['POST', ])
def check_login():
    if request.method == 'POST':
        data = {}
        for key in request.form:
            data[key] = request.form[key]
        if admin_users('check', data)[0]['count'] != 1:
            message = {'error': 'Unauthorized access'}
        else:
            session['username'] = request.form['username']
            message = {'accessGranted': 'true'}
            permission = admin_users('auth', session['username'])
            session['menu'] = CreateMenu(AssetsData(action='menuinfo', data=permission[0]).outdata())
        return make_response(jsonify(message), 200)
    return render_template('login.html')

创建这个方法后,我们要进行登录验证。可以这样做.

  
@app.route('/')
@login_required  # 作为一个装饰器来使用
def index():
    return render_template('index.html')

可是这种方法,有一个弊端。就是当我们创建了多个连接的时候,每一个连接,都需要,添加这个 @login_required装饰器。如果有一个连接遗忘了。没有添加,那么造成的后果,你们懂的。那么有没有什么办法,来解决这个问题呢。

再说第二个方法之前,我们先来,学习一个flask的知识点。
falsk中的内建装饰器 before_request(), after_request(), teardown_request(), g
我来解释下:
用 before_request() 装饰的函数会在请求前调用,它没有参 数。用 after_request()装饰的函数在请求结束后调用,需要 传入响应。它们必须返回那个响应对象或是不同的响应对象。但当异常抛出时,它们 不一定会被执行,这时可以使用teardown_request() 装饰器, 它装饰的函数将在响应构造后执行,并不允许修改请求,返回的值会被忽略。如果在 请求已经被处理的时候抛出异常,它会被传递到每个函数,否则会传入一个 None 。
我们把当前的数据库连接保存在 Flask 提供的 g 特殊对象中。这个 对象只能保存一次请求的信息,并且在每个函数里都可用。不要用其它对象来保存信 息,因为在多线程环境下将不可行。特殊的对象 g 在后台有一些神 奇的机制来保证它在做正确的事情。

下面,我们来展示下第二种方法。来验证用户登录

  
@app.before_request
def accessFilter():
    if 'username' not in session:
        return redirect(url_for('check_login'))

@app.route('/logout')
def logout():
    for key in ('username', 'password', 'menu'):
        session.pop(key, None)
    return redirect(request.args.get('next') or '/')

大家可以看出来了,使用了 app.before_request之后,就不需要在每个链接里面,在添加一个装饰器了。既方便,又美观。。

未经允许不得转载:99ya » flask 使用before_request() 进行用户登录验证

1

  1. #1

    假如做登陆接口呢..

    匿名4年前 (2015-10-09)