python - Flask 登录@login_required 不工作

标签 python flask flask-login

我正在使用 flask-login 来确保用户在访问某些页面之前已登录。我在要保护的 View 上使用 @login_required,但即使我在要设置用户的地方设置 login_user(user),它不让我进入我的 protected 路线(索引)。我打印出我的 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'))

最佳答案

我的问题是 @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")

关于python - Flask 登录@login_required 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37082988/

相关文章:

python - 使用字典将月份数字转换为月份名称的基本 Python 编程

python - 在wxpython中将变量从一个类传递到另一个类

python - 如何从自定义 flask 管理模板访问模型实例

python - PyCharm警告有关SQLAlchemy用户模型的意外参数

python - 如何使用 Flask-login 进行工作日志记录?

python - 如何在python中计算多边形的IOU?

python - 在 flask 蓝图中使用 flask 扩展

python - AWS Elastic Beanstalk 公开的源代码

nginx - 在nginx反向代理后面处理flask url_for

javascript - 减慢 Django Web 应用程序中 Vue.js 更新方法中的请求速率