2012-11-29 35 views
3

當用戶登錄到我的示例應用程序時,我在會話對象中添加一個用戶名密鑰,並將用戶對象掛在全局「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']) 
+0

問題是gunicorn。一旦我刪除了,heroku跑了應用程序罰款。 –

+1

你有多個工人使用gunicorn?如果是這樣的話,會話根本不會在不同的工作人員之間轉移。您需要某種中間層存儲(如Redis)來處理跨多個工作人員/服務器的會話。無論如何,這是你應該做的事情,因爲在一臺服務器上只有一名工作人員就不可能擴展應用程序。 – moodh

+0

是的,我認爲有多名工人。它產生了多個進程線程。我不確定如何使用redis和gunicorn。有關從哪裏開始的建議?我不希望這個應用程序擴展很多。 –

回答

3

嗯,看到這確實將是由於多名工人的答案,我會從評論部分移動它。 :)你不希望redis在gunicorn層,而是在你的應用程序。這四個環節應該幫助你:

1)First, enable/install Redis in Heroku

2)Then check this out(將取代燒瓶整個會話驅動程序與一個基於Redis的): 這可能是矯枉過正,我會簡單地使用Redis的作爲密鑰存儲值(檢查我的第三個鏈接),但您可能會喜歡這種方法。

3)Not as related but shows some usage examples (queue system for flask with redis)

4)Basic redis tutorial for python

這三個環節應該讓你開始,如果這還不夠,我會發掘一些更多的例子所以只是問,如果你需要他們!