2011-03-16 100 views
0

这是我第二次涉足Ajax,我不太清楚如何解决这个问题。Ajax登录用户...回调函数不起作用

所以我有一个模式窗口,当匿名用户试图执行某个任务时打开。该窗口包含一个用户注册表单,然后将$ .post添加到我的Django登录视图中。如果用户名/密码有效,则用户登录状态码1作为响应返回。如果不是,则返回状态0。

当我尝试在js之外做它,它的工作。但是,在我的脚本中,它失败了。我认为这与响应content_type有关,以及我如何解释它。我不确定。

def login_async(request):  
if request.method=='POST' and len(request.POST['username'])<20 and len(request.POST['password'])<20: 
    username=request.POST.get('username', '') #probably need to script tags here 
    password=request.POST.get('password', '') 
    user=auth.authenticate(username=username, password=password) 
    if user is not None: 
     auth.login(request,user) 
     status=1 
     response=HttpResponse() 
     response['Content_Type']="text/html" 
     response.write(status) 
     return response 
    else: 
     status=0 
     response=HttpResponse() 
     response['Content_Type']="text/html" 
     response.write(status) 
     return response 




$('input#login').click(function(event){ 
    $.post("/login_async/", {username:$('input[name=username]').val(), password:$('input[name=password]').val()}, //could also use $(this).serialize() here to capture all form inputs 
     function(data){ 
      if(data==1){ 
       $('#login').dialog("close"); 
       } 
    }); 
    }); 

这里有什么问题?我最初尝试将响应作为JSON返回,但我无法弄清楚如何使serialize.serializers(“json”,状态)工作。我不断收到错误。

最后一个问题......

如果我得到一个有效的状态(用户登录),这将影响到页面上的模态窗口的行为。模式窗口基于登录状态打开。如果用户已登录,则会在点击事件中打开一组窗口,反之亦然。此切换依赖于Django上下文{%user.is_authenticated%}。

在页面加载时,该上下文只渲染一次?我可以做任何事情来沟通状态变化的模式窗口,从简单的黑客安全吗?

+0

尝试将URL更改为“/ login_async”。另外,你看看控制台吗?我会尝试为请求失败和成功创建一个事件处理程序,并且每当发生任何情况时都会显示警报,以便知道请求是失败还是成功。 – mattsven 2011-03-16 22:32:05

回答

1

它应该是Content-Type。如果这不能解决您的问题,请尝试在$.post呼叫的末尾添加dataType参数。

$.post("/login_async/", {}, function(data){ 
    // fancy stuff 
}, "html"); 
+0

是的,感谢haochi,似乎有伎俩。不过,我的大问题依然存在。我现在登录了我的用户,但我不知道如何将这一事实传达给我的模态窗口,其行为由{%if user.is_authenticated%} django上下文变量支配 – Ben 2011-03-16 22:54:45

+0

@Brendan也许有一个变量它位于全局范围内,称为'var user_logged_in = {%user.is_authenticated%};'。登录过程之后,只需使用响应更新变量即可。在你的事件处理程序中只需添加一个'if(user_logged_in){} else {}' – Haochi 2011-03-17 01:37:38

0

是的,我认为它在越来越意识到,我应该只是取消绑定的模态窗口的现有的点击事件处理程序,然后绑定取决于Ajax响应新的事件处理程序。

我喜欢编程