2016-05-01 23 views
2

Djangoチュートリアルに基づいて簡単な投票アプリケーションを作成しました。ビジター1人あたりの投票数を1に制限したいので、Djangoのミドルウェアセッションを使用しました。セッションは全く新しいですが、ローカルマシンで何か作業をすることができました。残念ながら、一度それをHerokuにプッシュすると、動作しなくなりました。あなたが複数のdynosを持っているとき、私はこの問題について、いくつかの他のSOの記事を見ましたが、私はちょうど1ダイノと趣味アカウントの午前、そう...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を設定していませんでした。私はデフォルトがうまくいくと思った。私は上記の行を追加して、今働いているようです。 ドキュメントにはキャッシュの設定が記載されていますが、設定方法は完全にはわかりませんでした。それは必要ですか? また、ダイノが再起動したときにセッションが引き続き保持されることを確認するためのテスト方法がありますか? – knittingarch

+0

Heyo!だから、キャッシュ設定も同様に設定したいと思うでしょう=)ドキュメントを読んで、あなたが持っている設定に基づいて何を使うべきかを理解できます。セッションを今すぐテストしたい場合は、セッションを開始してから、 'heroku ps:restart'を実行してダイノスを強制的に再起動させてから、別のリクエストを行うことができます。 – rdegges

+0

優秀!助けてくれてありがとう。 – knittingarch

関連する問題