Flask登录@login_required无效

时间:2016-05-06 23:54:17

标签: python flask flask-login

我使用flask-login确保用户在访问某些页面之前已登录。我在我要保护的视图上使用@login_required,但即使我设置了login_user(user)我想要设置用户的地方,也不会让我进入我的受保护路线(索引)。我打印出user_login(user)的值,然后返回True。我做错了什么?

@app.route('/')
@app.route('/index')
@login_required
def index():
    print("was in here", file=sys.stderr)
    return render_template('index.html')

这是我设置user_login(user)

的路线
@app.route('/authenticate')
def authenticate():
    code = request.args.get('code')
    state = request.args.get('state')
    quiz_auth_response = quizlet_auth(code, state)

    g.token = quiz_auth_response['token']

    response = json.loads(make_request(quiz_auth_response['user_name']))

    try:
        user = models.User.get(models.User.username == response['username'])
        login_user(user)
    except models.DoesNotExist:
        print("does not exist", file=sys.stderr)
        user = models.User.create_user(response['username'], response['id'])
        return redirect('/index')
    else:
        login_user(user)
        print("log in user " + str(login_user(user)), file=sys.stderr)
        login_user(user)
        return redirect('/index')

这是我的user_loader

@login_manager.user_loader
def load_user(userid):
    try:
        return models.User.get(models.User.id == userid)
    except models.DoesNotExist:
        return None

这是我的用户模型

sqlite_db = SqliteDatabase('sqlite.db')

class BaseModel(Model):
    class Meta:
        database = sqlite_db

class User(UserMixin, BaseModel):
    username = CharField(unique=True)
    quizlet_id = CharField(unique=True)
    joined_at = DateTimeField(default=datetime.datetime.now)

    @classmethod
    def create_user(cls, username, quiz_id, **kwards):

        try:
            cls.select().where(
                (cls.username == username) | (cls.quizlet_id == quiz_id)
            ).get()
        except cls.DoesNotExist:
                print("putting user in thing", file=sys.stderr)
                user = cls(username = username, quizlet_id = quiz_id)

                print(user.username)
                user.save()
                return user
        else:
            raise Exception("User with that email exists already")

    @staticmethod
    def set_password(password):

        return generate_password_hash(password.encode('utf-8'))

5 个答案:

答案 0 :(得分:4)

我的问题是@flask_login.login_required装饰器位于@app.route('<path>')装饰器上方,所以我只替换了它们,就可以了

从此:

@flask_login.login_required
@app.route('/')
def index():
    return render_template("index.html")

对此:

@app.route('/')
@flask_login.login_required
def index():
    return render_template("index.html")

答案 1 :(得分:2)

花了最后2个小时尝试解决这个问题,并意识到这是因为配置中的login_required无法正常工作

在我的本地开发环境中,我设置了

<强> app.config['TESTING'] = True

  

来自flask-login documentation

     

如果应用程序配置变量 LOGIN_DISABLED TESTING 是   设置为True, login_required 装饰器将被忽略

将其设置回来并使其正常工作

<强> app.config['TESTING'] = False

答案 2 :(得分:1)

用户名字段是否为主键?假设您正在使用sql alchemy,get()方法将寻找主键并且不接受表达式,请参阅http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.query.Query.get

使用#nav li { /* padding: 0 16px; <-- remove; use text-align instead */ font: 400 18px/13px 'Open Sans', sans-serif; display: inline-block; width: 5em; text-align: center; border: 1px solid black; /* for illustration only */ } 再次尝试...

答案 3 :(得分:0)

只需检查用户是否已登录。可能存在用户已登录的 cookie。 我通过将用户设置为已登录并添加了一个 饼干。
我刚刚添加了这个并让它工作

@app.before_first_request
def init_app():
    logout_user()

而且效果很好

答案 4 :(得分:-1)

如果您正在使用flask-login,则需要确保您具有库可用于根据ID加载用户的功能。 这种类型的东西:

@login_manager.user_loader
def load_user(user_id):
    return models.User.get(models.User.id == user_id)

请阅读文档的this section了解如何操作。

相关问题