欢迎访问宙启技术站
智能推送

使用Flask.g在Python中实现用户认证与授权

发布时间:2024-01-01 06:33:45

在Python中,可以使用Flask框架实现用户认证与授权功能。Flask.g是Flask提供的一个全局对象,可以用来存储当前用户的登录信息。下面是一个使用Flask.g实现用户认证与授权的示例。

首先,需要创建一个Flask应用程序,并导入Flask、Blueprint和Flask.g:

from flask import Flask, Blueprint, Flask.g

然后定义一个用户认证蓝图(auth_bp)和一个用户认证装饰器(auth_required):

auth_bp = Blueprint('auth', __name__)

@auth_bp.before_app_request
def load_user():
    user_id = session.get('user_id')
    if user_id is not None:
        g.user = User.query.get(user_id)
    else:
        g.user = None

def auth_required(view_func):
    @functools.wraps(view_func)
    def wrapper(*args, **kwargs):
        if not g.user:
            return redirect(url_for('auth.login'))
        return view_func(*args, **kwargs)
    return wrapper

在load_user函数中,我们从session中获取用户ID,然后查询数据库获取用户对象,并将其保存在Flask.g的user属性中。在auth_required装饰器中,我们通过访问Flask.g.user来判断用户是否已登录,如果未登录则重定向到登录页面,否则继续执行视图函数。

接下来,定义一些用户认证和授权的视图函数:

@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        user = User.query.filter_by(username=username).first()
        if user and user.check_password(password):
            session['user_id'] = user.id
            return redirect(url_for('index'))
    return render_template('login.html')

@auth_bp.route('/logout')
def logout():
    session.pop('user_id', None)
    return redirect(url_for('index'))

@app.route('/dashboard')
@auth_required
def dashboard():
    return render_template('dashboard.html')

在登录视图函数中,我们获取表单数据,验证用户名和密码是否正确,并将用户ID保存在session中。在注销视图函数中,我们从session中移除用户ID,并重定向到首页。在dashboard视图函数中,我们使用了auth_required装饰器来保护该视图函数,只有已登录的用户才能访问该页面。

最后,在Flask应用程序中注册用户认证蓝图,并启动应用程序:

app = Flask(__name__)
app.secret_key = 'your_secret_key'

app.register_blueprint(auth_bp)

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

在运行应用程序之前,还需要根据具体的需求定义User模型和模板文件(如登录页面和仪表板页面)。

以上就是使用Flask.g实现用户认证与授权的示例,其中Flask.g用于存储当前用户的登录信息,通过用户认证装饰器可以实现对视图函数的保护,只有认证通过的用户才能访问受保护的页面。