2017-05-21 3 views
0

Der folgende Code funktioniert lokal, wenn ich den Entwicklungsserver von Django nutze, aber ich stoße auf zeitweilige Fehler in der Produktion mit Nginx und Gunicorn.Django Session KeyError, wenn der Schlüssel existiert

views.py

def first_view(request): 
    if request.method == "POST": 
     # not using a django form in the template, so need to parse the request POST 
     # create a dictionary with only strings as values 
     new_post = {key:val for key,val in request.POST.items() if key != 'csrfmiddlewaretoken'} 
     request.session['new_post'] = new_mappings # save for use within next view 

     # more logic here (nothing involving views) 
     return redirect('second_view') 

def second_view(request): 
    if request.method == 'POST': 
     new_post = request.session['new_post'] 
     # ... more code below 
     # render template with form that will eventually post to this view 

Ich werde manchmal KeyError nach der Einlieferung in die zweite Ansicht erhalten. Basierend auf der documentation on when sessions are saved scheint es, als ob die Sitzungsvariable gespeichert werden sollte, da sie die Sitzung direkt ändert. Auch, wenn ich die sessionid nehmen die Fehlerseite Debug-Panel zur Verfügung gestellt und die Sitzung über Djangos API zugreifen, kann ich die ‚new_post‘ Session-Variablen siehe

python manage.py shell 
>>> from django.contrib.sessions.backends.db import SessionStore 
>>> s = SessionStore(session_key='sessionid_from_debug_panel') 
>>> s['new_post'] 
# dictionary with expected post items 

Gibt es etwas, was ich bin fehlt? Vielen Dank im Voraus für Ihre Hilfe!

+0

Woraus besteht diese Variable? – Exprator

+0

Die Variable new_post ist ein Wörterbuch, das ich mit dem request.POST QueryDict in einem Wörterbuch-Verständnis erstellt habe. Die Werte sind alle Zeichenfolgen. – atm

+0

Sorry, ich habe den Namen der Variablen new_mappings verpasst? Bist du sicher, dass es nicht leer ist? Oder Sie tippen es anstelle von new_post ein? – Exprator

Antwort

0

Ok, endlich habe ich das Problem herausgefunden.

standardmäßig verwendet Django gecached Sitzungen, wenn Sie ein neues Projekt mit django-admin startproject project_name_here

In der Dokumentation erstellen sie warnt davor, dass das Caching nur in der Produktion eingesetzt werden sollte, wenn die Memcached Cache-Backend verwenden, da die Back-End-Cache local-Speicher NICHT ist Multi-Prozess sicher. https://docs.djangoproject.com/en/1.11/topics/http/sessions/#using-cached-sessions

Die Dokumentation warnt auch gegen lokale Speicher-Caching in der Bereitstellung Prüfliste: https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/#caches

ich die SESSION_ENGINE in settings.py zu ‚django.contrib.sessions.backends.db‘ geändert und der Fehler ging weg. https://docs.djangoproject.com/en/1.11/ref/settings/#session-engine

Ich hoffe, dies ist hilfreich für jemand anderen!

Verwandte Themen