2016-05-01 66 views
2

我寫了一個基於Django教程的簡單投票應用程序。我想限制每個訪問者的投票數量爲一個,所以我使用了Django的中間件會話。我對會話完全陌生,但我能夠在本地計算機上找到工作。不幸的是,一旦我把它推到Heroku,它就停止工作。我看到關於當你有多個DYNOS這個問題其他一些SO文章,但我就只有1 DYNO一個業餘愛好帳戶,所以......Django會話無法在Heroku上工作

下面是我的views.py邏輯:

def vote(request, question_id): 
    question = get_object_or_404(Question, pk=question_id) 
    if request.session.get('has_voted', False): 
     return render(request, 'poll/detail.html', { 
      'question': question, 
      'error_message': ("You've already voted."), 
      }) 
    try: 
     selected_choice = question.choice_set.get(pk=request.POST['choice']) 
    except (KeyError, Choice.DoesNotExist): 
     return render(request, 'poll/detail.html', { 
      'question': question, 
      'error_message': "Make sure to select a choice.", 
     }) 
    else: 
     selected_choice.votes += 1 
     selected_choice.save() 
     request.session['has_voted'] = True 
     return HttpResponseRedirect(reverse('results', args=(question.id,))) 

會話邏輯幾乎逐字從documentation來,我的settings.py配置正確。我錯過了Heroku的特殊配置嗎?畢竟,我是否需要添加一些東西到我的settings.py中?由於沒有實際的錯誤,我感到不知所措。它只是失敗的默默...

謝謝!

回答

1

你在settings.py中使用什麼樣的SESSION_ENGINE?在Heroku上,Dynos始終重新啓動,應該被視爲臨時資源。

要解決這個問題,您應該使用SESSION_ENGINE= 'django.contrib.sessions.backends.cached_db'。這將確保您的會話數據在Heroku上持久保存到您的數據庫(您正在使用Heroku Postgres,對吧?)

+0

謝謝!我正在使用Heroku Postgres。我根本沒有配置SESSION_ENGINE。我認爲默認會很好。我添加了上面的這一行,它現在似乎正在工作。 該文檔提到設置CACHES,但我不完全確定如何配置它。這是必要的嗎? 此外,有沒有一個好的方法來測試,以確保當dyno重新啓動時,會話仍然會持續? – knittingarch

+0

Heyo!因此,您還需要設置緩存設置=)通過閱讀文檔,可以根據您的設置瞭解要使用的內容。如果你想現在測試你的會話,你可以開始一個會話,然後說'heroku ps:restart'來強制你的dynos重啓,之後你可以發出另一個請求。 – rdegges

+0

優秀!非常感謝你的幫助。 – knittingarch