[英]Flask-User @login_required and @roles_required not working
[英]Flask login @login_required not working
我正在使用flask-login 来确保用户在访问某些页面之前已登录。 我在要保护的视图上使用@login_required
,但即使我在要设置login_user(user)
位置设置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'))
我的问题是@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")
刚刚花了最后 2 个小时试图解决这个问题,并意识到这是因为 login_required 无法正常工作的配置
在我的本地开发环境中,我设置了
app.config['TESTING'] = True
来自烧瓶登录文档
如果应用程序配置变量LOGIN_DISABLED或TESTING设置为 True,则login_required装饰器将被忽略
将它设置回这个并让它工作
app.config['TESTING'] = False
用户名字段是主键吗? 假设您使用的是 sql alchemy,get() 方法会寻找主键并且不接受表达式,请参阅http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm。查询.Query.get
再试一次user = models.User.filter_by(username=response['username'])
...
只需检查用户是否已登录。可能存在用户登录的 cookie。我通过将用户设置为已登录并添加了 cookie 来测试是否一切正常。
我刚刚添加了这个并让它工作
@app.before_first_request
def init_app():
logout_user()
它工作得很好
如果您使用flask-login,您需要确保您有一个函数可以被库使用以根据ID 加载用户。 这种类型的东西:
@login_manager.user_loader
def load_user(user_id):
return models.User.get(models.User.id == user_id)
请阅读文档的这一部分以了解如何操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.