烧瓶登录@login_required不工作 [英] Flask login @login_required not working

查看:495
本文介绍了烧瓶登录@login_required不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用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)
$ p $ @ 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 ['userna ('/ index')
else:
login_user(用户)
print(登录用户+ str (login_user(user)),file = sys.stderr)
login_user(user)
return redirect('/ index')

这里是我的user_loader

$ p $登录管理器用户加载
def load_user (userid):
try:
返回models.User.get(models.User.id == userid)
除了models.DoesNotExist:
返回无

这是我的用户模式

 <$ c 

$ sql $ db





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

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

try:
cls.select()。其中​​(
(cls.username == username) (cls.quizlet_id == quiz_id)
).get()
除了cls.DoesNotExist:
print(把用户放入东西,file = sys.stderr)
user (用户名= username,quizlet_id = quiz_id)

print(user.username)
user.save()
返回用户
其他:
举例Exception(用户已经存在该电子邮件)

@staticmethod
def set_password(password):

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


解决方案

解决这个问题,并意识到这是因为配置login_required不工作

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

$ $ b $ b blockquote>

烧瓶登录文档



如果应用程序配置变量 LOGIN_DISABLED TESTING
,则将忽略 login_required 装饰器

将其设置回来并使之有效

app.config ['TESTING'] = False $ b

I'm using flask-login to make sure users are logged in before they can access certain pages. I'm using @login_required on the view I want to protect, but even though I'm setting login_user(user) where I'm wanting to set the user, it does not let me go into my protected route (index). I'm printing out the value of my user_login(user) and it returns True. What am I doing wrong?

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

This is the route where I set the 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')

Here is my user_loader

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

Here is my User model

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'))

解决方案

Just spent the last 2 hours trying to fix this and realized that it was because off the configuration that the login_required was not working

On my local development environment, I had set

app.config['TESTING'] = True

From the flask-login documentation

If the application configuration variable LOGIN_DISABLED or TESTING is set to True, the login_required decorator will be ignored

set it back to this and got it working

app.config['TESTING'] = False

这篇关于烧瓶登录@login_required不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆