【问题标题】:Changing password in Django using AJAX使用 AJAX 在 Django 中更改密码
【发布时间】:2012-04-16 18:46:34
【问题描述】:

我正在开发一个网站,我已经集成了让用户更改他/她的密码的功能。我正在使用django.contrib.auth 中的内置视图。

现在,我们需要使用 AJAX。我的意思是,这个想法是在不重新加载整个页面的情况下将请求发送到服务器。如果密码更改正确,那么我只需要显示一条消息,如果没有,则显示每个字段错误的表单。

我可以为此创建一个单独的视图,但我想知道是否有替代方法?我的意思是,视图应该很简单,但已经在 django.contrib.auth...

【问题讨论】:

    标签: python ajax django django-views django-authentication


    【解决方案1】:

    绝对可以继承现有的 django.contrib.auth 视图,但我认为编写自己的 ajax 特定视图是一种更好的方法,而且它只需要几行代码。

    这可能是这样的:

    @login_required
    def change_password(request):
    
        if request.is_ajax():
            try:
                # extract new_password value from POST/JSON here, then
    
                user = User.objects.get(username=request.user.username)
            except User.DoesNotExist:
                return HttpResponse("USER_NOT_FOUND")
            else
                user.set_password(new_password)
                user.save()
    
            return HttpResponse("OK")
        else:
            return HttpResponse(status = 400)
    

    【讨论】:

    • OP 表示用户只能更改他/她的密码。这里的 GET 方法看起来也很糟糕。
    • @okm 当然。我还指的是change_password,而不是reset_password。 @BluesRockAddict 谢谢。事实上,我可以轻松地从password_change 视图复制和粘贴代码,然后修改响应,但我想知道是否有一种方法不涉及复制和粘贴代码。想想更好,我真的不认为有:(
    • 我的意思是为什么你需要 id 在这里,request.user 还不够吗?您的代码允许登录用户修改其他密码,这听起来很糟糕。此外,HTTP 方法有其自身的含义,GET 不适用于此类任务。
    • 不,这个视图同样适用于 POST(例如,如果你在 jQuery 中使用 $.ajax({ type: 'POST',...}) )。你说的“影响”是什么?
    • 检查stackoverflow.com/questions/506286/http-get-and-post。是的,它可以使用 POST 方法,只需向 URL 发布任何内容,例如 '/change_password/1/secret_password'...
    【解决方案2】:

    如果我要选择,我也会为您的目的实现一个单独的视图。

    理想情况下,如果django.contrib.auth 在基于类的视图中重新实现,您将能够重用更改密码的逻辑,并且只为返回更适合 AJAX 的响应的部分编写代码。但太糟糕了,我们没有这样的奢侈,至少对于 django 1.3 或更早版本来说是这样。

    但是要回答您的问题,是的,有一种替代方法(或者我称之为 hack)可以让您重用 django.contrib.auth 中的视图。假设您使用 jQuery,在提交更改密码表单时,您将向服务器发出 AJAX POST 请求并期望返回 html(如下图所示)。返回的 html 与使用非 AJAX POST 时获得的相同。

      var post_url = $form.attr("action");
      $.ajax({
        type: "POST",
        url: post_url,
        data: $form.serialize()
      }).done(function(html) {
        // check the html and use that to determine what message to prompt back to your user
      });
    

    【讨论】:

    • 即使这篇文章已经很老了,能否与我们分享一下您是如何使用 Ajax 实现 password_change_view 的?
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2020-02-29
    • 1970-01-01
    相关资源
    最近更新 更多