我正在建立一个支付网关,并使用会话来存储跨页面请求的数据。下面的类用于组织和存储会话的信息。

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)”是一个在其他上下文中完美工作的函数,如果成功则返回用户,否则返回用户)
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文档对会话的修改有一些解释,但我无法理解为什么要创建新会话或为什么要更改会话密钥。
编辑:
我正在使用数据库后端。

最佳答案

我已复制此错误/问题:
URL规则

url(r'^test/', 'shop.views.catalog.test', name="test")

查看函数
def test(request) :
    key1 = request.session.session_key
    request.session['test'] = 'test'
    key2 = request.session.session_key

    raise Exception("%s : %s === %s" % (key1, key2, request.session['test']))

清除127.0.0.1的cookies
至127.0.0.1:8000/测试/
测试时出现异常/
4793f2453758d7021a43a348a0f40a83:8568f729991e740395179c56cd37cf18==测试
刷新页面(不清除cookies)
测试时出现异常/
8568F72991E740395179C56CD37CF18:8568F72991E740395179C56CD37CF18==测试
所以在第一次修改会话之前,我有一个不同的会话密钥。。。意外的行为。我也很好奇为什么。

关于python - Django session :修改后更改 session key ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11192904/

10-16 16:08