python3使用flask_login的login_required装饰器无法跳转问题的解决

本文介绍了在Python3环境中使用Flask-Login时遇到的login_required装饰器无法跳转的问题。关键在于User类的get_id()方法在Python3中需要重写,因为默认返回的unicode(self.id)在Python3中已不再适用。修复此问题后,可以成功对路由进行保护。
摘要由CSDN通过智能技术生成

flask_login官方文档是:http://www.pythondoc.com/flask-login/

总结一下,在登录路由前,除了app,需要设置的有:User类(可以直接继承Usermixin),以及以下代码:

app.secret_key = os.urandom(24)
login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.login_view = 'login'
login_manager.login_message = u"用户未登录,请先登录。"
login_manager.init_app(app)

@login_manager.user_loader
def load_user(userid):
    return User.get(userid)

这里最重要也是最容易出问题的是user_loader回调!因为它负责记录用户是否登录。但是按照文档配置后加了@login_required装饰器的路由怎么也无法通过用户验证。问题就在User里:

from flask_login import UserMixin

class User(UserMixin):
    def __init__(self):           #最好从数据库获取,或使用加密方式获取,这里只简单示例
        self.id = 1     
        self.username
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的 Flask 登录跳转的小工程。 首先,您需要安装 FlaskFlask-Login 扩展,可以使用以下命令进行安装: ``` pip install Flask pip install Flask-Login ``` 接下来,创建一个名为 `app.py` 的 Python 文件,并将以下代码复制到文件中: ```python from flask import Flask, redirect, render_template, request from flask_login import LoginManager, UserMixin, login_required, login_user, logout_user app = Flask(__name__) app.secret_key = 'secret-key' # 设置 secret_key,用于 session 加密 login_manager = LoginManager() login_manager.init_app(app) # 模拟数据库中的用户信息 users = { 'test': {'password': '123456'} } # 定义一个 User 类,继承自 UserMixin class User(UserMixin): pass # 加载用户信息的回调函数 @login_manager.user_loader def load_user(user_id): user = User() user.id = user_id return user # 登录页面 @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] if username in users and password == users[username]['password']: user = User() user.id = username login_user(user) return redirect('/') else: return render_template('login.html', error=True) else: return render_template('login.html', error=False) # 首页,需要登录才能访问 @app.route('/') @login_required def index(): return 'Hello, World! <a href="/logout">Logout</a>' # 登出 @app.route('/logout') @login_required def logout(): logout_user() return redirect('/login') if __name__ == '__main__': app.run() ``` 在这个小工程中,我们定义了一个 `User` 类,继承自 `UserMixin`,用于存储用户信息。我们还定义了一个 `load_user` 函数,用于加载用户信息的回调函数。 在登录页面 `/login` 中,我们使用 POST 请求提交用户名和密码,并检查是否与模拟的用户信息匹配。如果登录成功,我们创建了一个 `User` 实例,并使用 `login_user` 函数将其登录。登录成功后,我们重定向到首页 `/`。 在首页中,我们使用 `@login_required` 装饰器,表示需要登录才能访问。如果用户未登录,则会自动重定向到登录页面。 在登出页面 `/logout` 中,我们使用 `logout_user` 函数将用户登出,并重定向到登录页面。 最后,在 `if __name__ == '__main__':` 下启动应用程序,可以使用以下命令进行启动: ``` python app.py ``` 这样就完成了一个简单的 Flask 登录跳转的小工程。希望能对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值