flask使用装饰器实现登录验证

在很多业务处理的时候都需要用户在登陆状态下才可以进行,为了防止用户进行错误的操作,就需要添加登录验证。
1、创建一个进行登录验证的装饰器

def login_required(func):
    @functools.wraps(func) # 修饰内层函数,防止当前装饰器去修改被装饰函数的属性
    def inner(*args, **kwargs):
        # 从session获取用户信息,如果有,则用户已登录,否则没有登录
        user_id = session.get('user_id')
        print("session user_id:", user_id)
        if not user_id:
            # WITHOUT_LOGIN是一个常量
            return jsonify(errcode=constants.WITHOUT_LOGIN,
                           err="用户未登录")
        else:
            # 已经登录的话 g变量保存用户信息,相当于flask程序的全局变量
            g.user_id = user_id
            return func(*args, **kwargs)
    return inner

2、在需要登录才能进入的url下使用

@api.route('/index')
@login_required
def index():
    return "<h1>index</h1>"

3、测试
未登录状态下,访问index页面被拦截
在这里插入图片描述
登录状态下,正常访问index页面
在这里插入图片描述

用户登录模块是Web应用程序中非常基础的模块之一。在Flask框架中,实现用户登录功能通常需要借助Flask-WTF扩展和Flask-Login扩展。 Flask-WTF扩展提供了表单验证和CSRF保护等功能,而Flask-Login扩展则提供了用户认证和管理功能。 下面是用户登录模块的详细设计: 1. 创建Flask应用程序对象 ```python from flask import Flask app = Flask(__name__) ``` 2. 配置Flask应用程序对象 ```python app.config['SECRET_KEY'] = 'secret_key' app.config['WTF_CSRF_SECRET_KEY'] = 'csrf_secret_key' ``` SECRET_KEY和WTF_CSRF_SECRET_KEY是用于加密和CSRF保护的密钥。可以自行生成,也可以使用随机字符串生成函数。 3. 创建用户登录表单 ```python from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Length class LoginForm(FlaskForm): username = StringField('Username', validators=[DataRequired(), Length(min=6, max=20)]) password = PasswordField('Password', validators=[DataRequired(), Length(min=6, max=20)]) submit = SubmitField('Login') ``` 用户登录表单包含用户名和密码两个字段以及一个提交按钮。使用wtforms库,可以方便地创建表单和验证表单数据。 4. 创建用户模型 ```python from flask_login import UserMixin class User(UserMixin): def __init__(self, id, username, password): self.id = id self.username = username self.password = password def get_id(self): return str(self.id) ``` 用户模型需要继承Flask-Login扩展的UserMixin类,并实现get_id方法。get_id方法返回一个字符串类型的用户ID,用于Flask-Login扩展的用户认证和管理。 5. 实现用户认证回调函数 ```python from werkzeug.security import check_password_hash users = [ User(1, 'user1', 'password1'), User(2, 'user2', 'password2') ] def authenticate(username, password): for user in users: if user.username == username and check_password_hash(user.password, password): return user def load_user(user_id): for user in users: if user.id == int(user_id): return user ``` authenticate函数用于验证用户身份,如果验证成功返回用户对象,否则返回None。load_user函数用于根据用户ID返回用户对象。 6. 配置Flask-Login扩展 ```python from flask_login import LoginManager login_manager = LoginManager(app) login_manager.login_view = 'login' login_manager.login_message = 'Please login to access this page.' @login_manager.user_loader def load_user(user_id): return load_user(user_id) ``` 配置Flask-Login扩展需要传入Flask应用程序对象。login_view属性设置登录页面的路由名称,login_message属性设置登录提示信息。@login_manager.user_loader装饰器用于指定load_user函数。 7. 实现用户登录路由 ```python from flask import render_template, redirect, url_for, flash, request from flask_login import login_user, logout_user, current_user @app.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): user = authenticate(form.username.data, form.password.data) if user is not None: login_user(user) next = request.args.get('next') return redirect(next or url_for('index')) else: flash('Invalid username or password.') return render_template('login.html', form=form) ``` 用户登录路由处理函数使用@login_required装饰器保护,只有登录用户才能访问。使用authenticate函数验证用户身份,如果验证成功则调用login_user函数实现用户登录。如果登录成功,则跳转到原始请求页面或首页,否则显示错误信息。 8. 实现用户注销路由 ```python @app.route('/logout') @login_required def logout(): logout_user() return redirect(url_for('index')) ``` 用户注销路由处理函数使用@login_required装饰器保护,只有登录用户才能访问。使用logout_user函数实现用户注销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值