【问题标题】:Jquery validation - checking email and username availability from server-side DjangoJquery 验证 - 从服务器端 Django 检查电子邮件和用户名的可用性
【发布时间】:2012-04-14 23:06:06
【问题描述】:

我正在尝试从使用 Django 编程的服务器端验证电子邮件和用户名可用性的注册表单。我检查了这个jQuery Validation Plugin remote check for password with Django 但我得到了 403 禁止 - CSRF 验证失败。我尝试在 jquery 脚本中包含 csrf 令牌。但仍然无法正常工作。我在下面显示了用于检查电子邮件可用性的代码。

views.py:

def email_check(request):
    response_str="false"
    if request.is_ajax():
        e = request.POST.get("email_address")
        try:
            obj = User.objects.get(email=e)
        except DoesNotExist:
            response_str="true"
    return HttpResponse(response_str)

urls.py:

url(r'^signup/email/check/$', 'registration.views.email_check')

注册.html: https://gist.github.com/2253002

有人可以帮我解决这个问题吗?

谢谢!

【问题讨论】:

标签: jquery python django jquery-plugins jquery-validate


【解决方案1】:

您应该在名为“X-CSRFToken”的 cookie 中发送 csrf 令牌,有一种方法可以使用 jQuery 全局启用此行为,如下所示:

https://docs.djangoproject.com/en/1.4/ref/contrib/csrf/#ajax

【讨论】:

    【解决方案2】:
    $('html').ajaxSend(function(event, xhr, settings) {
        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie != '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) == (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }
        if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
            // Only send the token to relative URLs i.e. locally.
            xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
        }
    });
    

    在您的模板中引用上述 jquery 代码,以确保您的 AJAX POST 调用始终包含 csrf 令牌。详情请查看官方文档中的this article。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 2018-04-15
      • 1970-01-01
      • 2017-02-07
      • 1970-01-01
      • 2012-04-07
      • 2012-02-13
      相关资源
      最近更新 更多