2012-10-18 15 views
0

我得到的每個新用戶自動創建用戶帳戶和重定向中間件:如何在使用Django會話的中間件中檢查cookie支持?

class LogNewUser(object): 

    def process_request(self, request): 

     user_id = request.session.get('uid', None) 

     if not user_id: 
      user = User.objects.create(username=generate_name()) 
      request.session['uid'] = user.pk 
      return redirect(request.path) 

     else: 
      request.user = User.objects.get(pk=user_id) 

當然,如果瀏覽器具有的cookie禁用,這將創建一個無限循環的重定向。

我想測試用戶是否啓用cookie,如果是,請執行我的操作,如果沒有,則創建一個特定的用戶對象,這對所有非cookie用戶都是相同的。

我嘗試了request.session.set_test_cookie()request.session.test_cookie_worked()的不同組合,但我無法找到我想要的方式。

+0

檢查cookie的問題是,您可以設置一個cookie,但僅在下一個請求中檢查它... – Jingo

+0

我知道問題,我正在尋找解決方案。我昨天凌晨4點發現的! –

+0

不錯,所以請讓我們知道:) – Jingo

回答

1

我意識到挑戰是找到一種方法來說你已經嘗試設置一個測試cookie。由於HTTP是無狀態的,這樣做的唯一途徑是將信息封裝到我們重定向到URL,並在中間件再次抓住它:

class LogNewUser(object): 

    def process_request(self, request): 

     if 'testcookie' in request.path: 

      next = request.GET.get('next', '/') 

      if not request.session.test_cookie_worked(): 
       return render(request, 'cookie_error.html') 

      request.session.delete_test_cookie() 

      user = User.objects.create(username=generate_name()) 
      request.session['uid'] = user.pk 
      return redirect(request.GET.get('next', '/')) 

     if not request.user.is_authenticated(): 

      user_id = request.session.get('uid', None) 

      if not user_id: 

       request.session.set_test_cookie() 
       return redirect('/testcookie/?next=%s' % request.path) 

      request.user = User.objects.get(pk=uid) 

在這段代碼中,我們沒有能力爲所有非Cookie用戶創建一個用戶對象。這是因爲這種技術不可能在每個請求都沒有重定向的情況下執行,這將會終止POST請求。但是:

  • 我在這裏處理這種情況,爲非cookie用戶重定向到一個模板,該模板解釋了問題以及爲瀏覽器啓用cookie的方式。
  • 如果您真的需要,您可以通過使用session ID in the URL query string來傳遞此問題。