2013-04-22 70 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