2016-05-01 13 views
2

Ich habe eine einfache Voting-App geschrieben, die auf dem Django-Tutorial basiert. Ich möchte die Anzahl der Stimmen pro Besucher auf eins beschränken, also habe ich Djangos Middleware-Sitzungen benutzt. Ich bin völlig neu in Sitzungen, aber ich konnte etwas auf meinem lokalen Rechner arbeiten. Leider, sobald ich es nach Heroku geschoben hatte, hörte es auf zu arbeiten. Ich sah ein paar anderen SO Artikel zu diesem Thema, wenn Sie mehrere dynos haben, aber ich bin auf einem Hobby-Konto mit nur 1 dyno, so ...Django-Sitzung funktioniert nicht auf Heroku

Hier ist die Logik in meinem 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,))) 

Die Sitzungslogik kommt fast wörtlich aus der documentation, und meine settings.py ist korrekt konfiguriert. Gibt es eine spezielle Konfiguration für Heroku, die ich vermisst habe? Muss ich etwas zu meinem settings.py hinzufügen? Ich bin ratlos, da es keinen tatsächlichen Fehler gibt. Es schlägt einfach still ...

Danke!

Antwort

1

Welche Art von SESSION_ENGINE verwenden Sie in Ihrer settings.py? Auf Heroku starten Dynos die ganze Zeit neu und sollten als kurzlebige Ressourcen behandelt werden.

Um dies zu vermeiden, sollten Sie wahrscheinlich SESSION_ENGINE= 'django.contrib.sessions.backends.cached_db' verwenden. Dadurch wird sichergestellt, dass Ihre Sitzungsdaten in Ihrer Datenbank auf Heroku gespeichert werden (Sie verwenden Heroku Postgres, oder?)

+0

Vielen Dank! Ich benutze Heroku Postgres. Ich hatte SESSION_ENGINE überhaupt nicht konfiguriert. Ich nahm an, dass der Standard in Ordnung wäre. Ich habe die obige Zeile hinzugefügt und es scheint jetzt zu funktionieren. Die Dokumentation erwähnt Einstellung CACHES, aber ich war nicht ganz sicher, wie Sie es konfigurieren. Ist das notwendig? Gibt es auch eine gute Möglichkeit zu testen, um sicherzustellen, dass die Sitzung beim Neustart des Dynos weiterhin bestehen bleibt? – knittingarch

+0

Hallo! Daher sollten Sie auch Ihre Caching-Einstellungen festlegen. =) Wenn Sie die Dokumente lesen, werden Sie verstehen, was Sie je nach Ihrer Konfiguration verwenden müssen. Wenn Sie Ihre Sitzungen sofort testen möchten, können Sie eine Sitzung starten und dann 'heroku ps: restart 'sagen, um Ihre Dynos neu zu starten. Danach können Sie eine weitere Anfrage stellen. – rdegges

+0

Ausgezeichnet! Vielen Dank für deine Hilfe. – knittingarch

Verwandte Themen