2013-04-22 75 views
1

我有一個站點使用Django中的自定義身份驗證,使用用戶名,密碼和域對Web服務進行身份驗證。我需要爲每個後續視圖的請求對象存儲這些信息。Django調用Django會話

似乎一切順利,直到我試圖做一個jQuery的$ .ajax調用,調試從ajax請求調用的視圖我沒有會話信息,用戶是AnonymousUser。

我需要會話變量來隨後調用Web服務才能顯示數據。我已經嘗試了幾件事,但似乎沒有任何工作正常。我想確保用戶能夠提交這些Web服務查詢之前登錄,因爲我想讓用戶名/域在視圖中查找密碼(並且不在客戶端)並確保用戶始終。登錄

views.py

def login(request): 
    if settings.DEBUG == True: 
     print "views.login:Attempting loging at views.login(request)" 

    if request.method == 'POST': 
     if settings.DEBUG: 
      print "views.login: method is POST" 

     form = LoginForm(request.POST) 

     if form.is_valid(): 
      if settings.DEBUG: 
       print "Form is valid, attepmting to authenticate" 
      Login(request, form.get_user()) 
      str = reverse('cm_base.views.index') 
      request.session['username']=form.get_user() 
      request.session['domain']=form.get_domain() 

      return render_to_response('cm_base/index.html', 
           {"DEBUG": True, 
           "user":request.session.get('username'), 
           'tabs': settings.TAB_LIST}, 
           context_instance=RequestContext(request)) 
     else: 
       # Their password/email combination must have been incorrect 
      pass 

    else: 
     form = LoginForm() 

    return render_to_response('cm_base/login.html', 
           {"DEBUG": True, 
           'form' : form 
           }, 
           context_instance=RequestContext(request)) 

@login_required() 
def index(request): 
    if request.method == 'POST': 
     print "POSTING" 
    if settings.DEBUG == True: 

     print "views.index:Opening index" 

    return render_to_response('cm_base/index.html', 
           {"DEBUG": True, 
           "user":"user", 
           'tabs': settings.TAB_LIST}, 
           context_instance=RequestContext(request)) 

@login_required() 
def scorecard(request): 
    user = CustomUser.objects.get(username=request.session.get('username'), 
            domain=request.session.get('domain')) 

*失敗與DoesNotExist上述行:CustomUser匹配查詢不存在。查找參數爲{「用戶名」:無,「域」:無}

base.js

$.ajax({ 
    url : path, 
    data: $(this).serialize(), 
    headers: {'X-CSRFToken':getCookie('csrftoken') 
     ,'sessionid':getCookie('sessionid') 
     }, 
    success : function(data) { 
     console.log($(this)); 
     //refresh right div 
     $('#contentpane').empty(); 
     $('#contentpane').html(data.rhtml); 
     console.log(data.rhtml); 
    } 
}); 
+0

a)request.POST'的內容是什麼?你確定你正在編碼你的js中的正確數據 - 什麼是$(this)綁定? '$(this).serialize()'的內容是什麼? Web開發工具(Firebug或Google Chrome開發工具)應該能夠向您顯示請求和響應數據 – scytale 2013-04-22 12:43:21

+0

request.POST/.GET都是空字典(螢火蟲中的argv未定義)。 Cookies只有csrftoken,session是一個空字典,request.user是AnonymouseUser。我覺得我要麼沒有堅持請求對象的Ajax請求或非常相似的東西。 $(this).serialize()是我在其他代碼中看到的東西,我曾希望它會序列化響應...但是...這是一個假設,顯然不是這種情況。 – microbial 2013-04-22 18:33:27

+0

啊。您可能應該對如何編寫AJAX登錄表單做更多的研究。基本上你需要從表單和''ajax'調用的'data'參數中獲得'username'和'password'。如果'ajax'調用以正確的方式綁定到'onSubmit'形式,'$(this).serialize()'會爲你做這件事。 – scytale 2013-04-23 09:36:10

回答

1

看起來像我的實現,這是問題的後端。

backends.py

class CustomBackend(object) 
... 
def get_user(self, username): 
    try: 
     return CustomUser.objects.get(username=username) 
    except CustomUser.DoesNotExist: 
     return None 

這是會議期間通過調用並實際使用的主鍵是一個用戶ID,不是用戶名所以這總是沒有返回用戶,並默認爲匿名用戶。我錯誤地解釋了documentation說用戶標識可以是任何東西,包括用戶名,我想我可以通過它,但我有一個自動生成的用戶ID和對象的用戶名。

+0

謝謝!我有完全相同的問題。 – SummerBreeze 2016-08-23 12:13:13