2017-05-21 6 views
0

が存在します。DjangoのセッションKeyError例外キーは、私はDjangoの開発サーバを使用する場合は、次のコードは、ローカルで動作しますが、私はnginxのとGunicornと生産の断続的なバグに実行しています

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 

私は時々、2番目のビューに掲示した後、KeyError例外を受け取ることになります。 documentation on when sessions are savedに基づいて、セッション変数をセーブする必要があるのは、セッションを直接変更するためです。私は、セッションIDは、エラー・ページのデバッグパネルを提供取り、DjangoのAPIを経由してセッションにアクセスする場合にも、私は「new_post」セッションを見ることができる変数

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 

私は欠けているものはありますか?あなたの助けを前もってありがとう!

+0

この変数はどのようなものですか? – Exprator

+0

new_post変数は、dictionary comprehensionでrequest.POST QueryDictを使用して作成している辞書です。値はすべて文字列です。 – atm

+0

申し訳ありませんが、変数new_mappingsの名前が見つかりませんでしたか? Rあなたは確かにその空白ではない?または、new_postの代わりに入力すると間違っていますか? – Exprator

答えて

0

[OK]を、私は最終的に問題を考え出しました。あなたはそれがMemcachedをキャッシュバックエンドを使用した場合、ローカル・メモリキャッシュバックエンドではないので、そのキャッシングが唯一の生産に使用する必要があります警告してドキュメントでdjango-admin startproject project_name_here

を使用して新しいプロジェクトを作成するときにデフォルトで

は、Djangoは、キャッシュされたセッションを使用していますマルチプロセスセーフです。 https://docs.djangoproject.com/en/1.11/topics/http/sessions/#using-cached-sessions

ドキュメントも展開チェックリストにローカルメモリキャッシュに対して警告する:https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/#caches

私は「django.contrib.sessions.backends.db」にsettings.pyにSESSION_ENGINEを変更し、エラーが去っていきました。 https://docs.djangoproject.com/en/1.11/ref/settings/#session-engine

希望これは他の誰かに便利です!

関連する問題