当用户登录我的示例应用程序时,我将一个用户名密钥添加到会话对象中,并将用户对象挂起全局“g”对象。见下文。
@app.route('/login/', methods=['GET', 'POST'])
def login():
"""Logs the user in."""
error = None
if request.method == 'POST':
print("login hit")
user = get_user(request.form['username'])
if user is None:
error = 'Invalid username'
print error
elif not check_password_hash(user.password, request.form['password']):
error = 'Invalid password'
print error
else:
flash('You were logged in')
print "logged in"
session['username'] = request.form['username']
g.user = request.form['username']
print error, "error"
return redirect(url_for('main'))
现在,如果用户成功登录(正在发生的事情),他将重定向到主页面。这将拆除旧请求并生成一个新请求。问题是当新请求开始时,会话被擦除。我打印出会话密钥,它们都是空的。这只发生在heroku上,而不是在我的本地机器上。我做错了什么。
@app.before_request
def before_request():
print session.keys(), session.values() # shows [] []
print("before request")
print ('username' in session, "in session?")
g.db = connect_db()
g.user = None
if "username" in session:
g.user = get_user(session['username'])
答案 0 :(得分:5)
嗯,看到这确实是由于多个工作人员的答案我将从评论部分移动它。 :)你不希望redis在gunicorn层,而不是你的应用程序。这四个链接可以帮助你:
1)First, enable/install Redis in Heroku
2)Then check this out(将使用基于redis的一个替换Flasks整个会话驱动程序): 这可能是矫枉过正,我只是将redis用作应用程序中的密钥存储值(查看我的第三个链接),但您可能会喜欢这种方法。
3)Not as related but shows some usage examples (queue system for flask with redis)
4)Basic redis tutorial for python
这三个链接应该让你开始,如果还不够我会挖掘更多的例子,所以只要问你是否需要它们!