首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >烧瓶可以登录,但是当重定向到login_required装饰url时,它失败了

烧瓶可以登录,但是当重定向到login_required装饰url时,它失败了
EN

Stack Overflow用户
提问于 2022-05-15 16:55:20
回答 1查看 29关注 0票数 0

我已经定义了一个从UserMixin继承的用户类

代码语言:javascript
复制
class User(UserMixin):
    ID = 1

    def __init__(self, username, password, email, role):
        self.id = User.ID
        self.username = username
        self.password = password
        self.email = email
        self.role = role
        User.ID += 1

    def __repr__(self):
        return '<User %r>' % self.username

    def verify_password(self, raw_password):
        return check_password_hash(self.password, raw_password)

class AdminSet(object):
    admin1 = User(username='admin1', password=generate_password_hash('admin1', method='pbkdf2:sha1', salt_length=5),
                  email='admin1@admin.com', role=0)
    admin2 = User(username='admin2', password=generate_password_hash('admin2', method='pbkdf2:sha1', salt_length=5),
                  email='admin2@admin.com', role=1)
    admin_list = [admin1, admin2]

    @classmethod
    def add(cls, user):
        cls.admin_list.append(user)

    @classmethod
    def commit(cls, **kwargs):
        admin = User(**kwargs)
        cls.admin_list.append(admin)

    @classmethod
    def delete(cls, user_id):
        pass

    @classmethod
    def searchID(cls, id):
        for admin in cls.admin_list:
            if admin.id == id:
                return admin
        return None

    @classmethod
    def queryFirst(cls, username):
        for admin in cls.admin_list:
            if admin.username == username:
                return admin
        return None

这是我的登录网址和main.index

代码语言:javascript
复制
@auth.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        print('password:', form.password.data)
        # try:
        user = AdminSet.queryFirst(form.username.data)
        if user.verify_password(form.password.data):
            print("same")
            login_user(user)
            print(current_user)
            return redirect(url_for('main.index'))
        else:
            print("different")
            flash('wrong')
        # except:
        #     print("exception")
        #     flash('用户名或密码错误')
    return render_template('auth/login.html', form=form)

@main.route('/index', methods=['GET'])
@login_required
def index():
    return render_template('main/index.html')

当我登录时,我从控制台得到的信息如下:

代码语言:javascript
复制
127.0.0.1 - - [16/May/2022 00:37:10] "POST /login?next=%2F HTTP/1.1" 302 -
same
<User 'admin1'>
127.0.0.1 - - [16/May/2022 00:37:10] "GET /static/login/styles.css HTTP/1.1" 304 -
127.0.0.1 - - [16/May/2022 00:37:10] "GET /static/login/demo.css HTTP/1.1" 304 -
127.0.0.1 - - [16/May/2022 00:37:10] "GET /static/login/loaders.css HTTP/1.1" 304 -
127.0.0.1 - - [16/May/2022 00:37:10] "GET /static/js/login/jquery.min.js HTTP/1.1" 304 -
127.0.0.1 - - [16/May/2022 00:37:10] "GET /static/js/login/jquery-ui.min.js HTTP/1.1" 304 -
127.0.0.1 - - [16/May/2022 00:37:10] "GET /static/layui/layui.js HTTP/1.1" 304 -
127.0.0.1 - - [16/May/2022 00:37:10] "GET /static/js/login/stopExecutionOnTimeout.js?t=1 HTTP/1.1" 304 -
127.0.0.1 - - [16/May/2022 00:37:10] "GET /static/js/login/Particleground.js HTTP/1.1" 304 -
127.0.0.1 - - [16/May/2022 00:37:11] "GET /index HTTP/1.1" 302 -

您可以看到用户已成功加载和打印,并执行代码return redirect(url_for('main.index'))

然后,页面再次被重定向到auth.login

我没有选择数据库是出于某种原因,我不知道我的代码是否有问题,我使用调试器来检查login_user()函数,但是我没有得到任何有用的信息。

EN

回答 1

Stack Overflow用户

发布于 2022-05-16 02:38:45

问题是user_loader回拨时出错了

这是最初的版本

代码语言:javascript
复制
@login_manager.user_loader
def load_user(user_id):
    return AdminSet.searchID(user_id)

在user_id上做一个小小的改动

代码语言:javascript
复制
@login_manager.user_loader
def load_user(user_id):
    return AdminSet.searchID(int(user_id))

很好用!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72250349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档