我使用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'))
答案 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
强>
如果应用程序配置变量 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了解如何操作。