【问题标题】:JQuery ajax call with django session使用 django 会话的 JQuery ajax 调用
【发布时间】:2013-04-14 22:36:45
【问题描述】:

我有一个在 Django 中使用自定义身份验证的站点,它使用用户名、密码和域对 Web 服务进行身份验证。我需要为每个后续视图的请求对象存储此信息。

一切似乎都很顺利,直到我尝试进行 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'))

*fails on the above line with DoesNotExist: CustomUser 匹配查询不存在。查找参数为 {'username': None, 'domain': None}

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);
    }
});

【问题讨论】:

  • a) request.POST 的内容是什么?你确定你在你的js中编码了正确的数据 - $(this) 绑定到什么? $(this).serialize()的内容是什么? Web 开发工具(Firebug 或 Google Chrome 开发工具)应该能够向您显示请求和响应数据
  • request.POST/.GET 都是空字典(firebug 中帖子中的 argv 未定义)。 Cookies 只有 csrftoken 和 session 是一个空字典,以及 request.user 是 AnonymouseUser。我觉得我要么没有将请求对象持久化到 ajax 请求或类似的东西。 $(this).serialize() 是我在其他代码中看到的,我曾希望它会序列化响应......但是......这是一个假设,显然不是这样。
  • 啊。您可能应该对如何编写 AJAX 登录表单进行更多研究。基本上,您需要从表单中获取usernamepassword 并进入ajax 调用的data 参数。如果ajax 调用以正确的方式绑定到表单onSubmit$(this).serialize() 将为您执行此操作。

标签: ajax django session authentication


【解决方案1】:

看起来我的后端实现是问题所在。

后端.py

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

这是在会话传递期间调用的,实际上使用的是用户 ID,而不是用户名的主键,因此它始终不返回任何用户并默认为匿名用户。当documentation 说用户 ID 可以是任何东西(包括用户名)时,我误解了,我认为我可以将其传递进去,但我同时拥有自动生成的用户 ID 和对象上的用户名。

【讨论】:

  • 谢谢!我遇到了完全相同的问题。
猜你喜欢
  • 2012-02-28
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 2012-12-15
相关资源
最近更新 更多