支払いゲートウェイをセットアップしており、セッションを使用してページ リクエスト間でデータを保存しています。以下のクラスは、情報を編成してセッションに保存するために使用されます。
class Gateway:
def __init__(self, session_key=None, session_name="FOO"):
# Store session ID and name
self.session_key = session_key
self.session_name = session_name
# Get the session
session = SessionStore(session_key=self.session_key)
try :
data = session[self.session_name]
except :
data = {user_id:None, checked_in:False }
self.__dict__.update(data)
def save(self) :
session = SessionStore(session_key=self.session_key)
session[self.session_name] = deepcopy(self.__dict__)
try :
del session['session_key']
del session['session_name']
except :
pass
session.save()
このビューは、ユーザーがログインしているかどうかを確認します。ログインしている場合は、リダイレクトされます。そうでない場合は、ゲストとしてログインまたはチェックインするよう求められます。
def check_in(request):
gateway = Gateway(session_key=request.session.session_key)
if request.user.is_authenticated():
gateway.user_id = request.user.id
gateway.checked_in = True
gateway.save()
return redirect('next_step')
else:
login_form = FormLogin()
if request.POST:
data = request.POST.copy()
if 'login' in data:
login_form = FormLogin(data)
if login_form.is_valid():
user = login(request, login_form)
if user:
gateway.user_id = user.id
gateway.checked_in = True
gateway.save()
return redirect('next_step')
elif 'guest' in data:
gateway.checked_in = True
gateway.save()
return redirect('next_step')
return render(
request,
'shop/login.html',
{
'login_form':login_form,
}
)
次のビューは、「checked_in」変数をチェックします。これは、ユーザーがログイン/チェックイン プロセスをスキップしないようにするためです。(補足として、関数「login(request, login_form)」は、他のコンテキストで完全に機能する関数であり、成功した場合は User を返し、それ以外の場合は None を返します)
def next_step(request):
gateway = Gateway(session_key=request.session.session_key)
if not gateway.checked_in:#edited
messages.info(request, _(u'You must specify login first.'))
return redirect('check_in')
else:
#do the next step
問題は次のとおりです。
ユーザーが認証されている場合でも、「checked_in」変数はまだ false であり、ビューがループします。変数を設定して保存するたびに、新しいセッション ID を持つ新しいセッションが作成されます。django ドキュメントには、セッションの変更に関する説明がありますが、新しいセッションが作成される理由やセッション キーが変更される理由がわかりません。
編集: データベース バックエンドを使用しています。