當用戶登錄到我的示例應用程序時,我在會話對象中添加一個用戶名密鑰,並將用戶對象掛在全局「g」對象之外。見下文。在heroku上不存在的瓶頸會話
@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'])
問題是gunicorn。一旦我刪除了,heroku跑了應用程序罰款。 –
你有多個工人使用gunicorn?如果是這樣的話,會話根本不會在不同的工作人員之間轉移。您需要某種中間層存儲(如Redis)來處理跨多個工作人員/服務器的會話。無論如何,這是你應該做的事情,因爲在一臺服務器上只有一名工作人員就不可能擴展應用程序。 – moodh
是的,我認爲有多名工人。它產生了多個進程線程。我不確定如何使用redis和gunicorn。有關從哪裏開始的建議?我不希望這個應用程序擴展很多。 –