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

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= 'root'
        self.password = '123'

   #注意!这里必须重写,因为源码使用unicode(id),但是python3没有unicode()方法!此时就无法登录用户!
    def get_id(self):
        return self.id

    @staticmethod
    def get(user_id):
        """try to return user_id corresponding User object.
        This method is used by load_user callback function
        """
        if not user_id:
            return None
        try:
            if user_id == 1 :  #最好从文件或数据库读取id(这里为简单写死为1了)
                return User()
        except:
            return None
        return None

在源码中,get_id()方法返回的是unicode(self.id),但是python3取消了unicode方法!所以必须重写该方法,重写后就可以使用@login_required对路由进行保护了了!

你可能感兴趣的:(python3使用flask_login的login_required装饰器无法跳转问题的解决)