【问题标题】:How do you pass Django csrf token in jquery validation plugin?你如何在 jquery 验证插件中传递 Django csrf 令牌?
【发布时间】:2015-09-29 07:12:27
【问题描述】:

我正在尝试创建客户端验证,以查看是否在注册时使用了用户名。此验证应该在用户提交表单之前发生。

为了实现这一点,我使用了 jquery 验证插件:http://jqueryvalidation.org/

我遇到的问题是我收到 403 错误:

POST example.com/check-username 403 (FORBIDDEN)

这是客户端验证的代码: $(document).ready(function () {

      $('#register-form').validate({ // initialize the plugin
        rules: {
          username: {
            required: true,
            remote: {
              url: "/check-username",
              type: "post",
              data: {
                csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value,
                username: function() {
                  return $( "#id_username" ).val();
                }
              }
            }
          }
        }
      });
});

这是我在 views.py 中的验证函数:

def check_username(request):
    username = request.POST.get('username', None)

    if not username:
        return HttpResponseBadRequest("Invalid username")
    return User.objects.exists(username=username) 

我怀疑这是一个 csrf 错误,但我不太确定如何与 jquery 验证插件一起工作。我该怎么做呢?

【问题讨论】:

  • 你读过docs吗?
  • 特别是Ajax 上的部分,它提供了示例代码,准确地显示了如何执行此操作。

标签: jquery python django validation


【解决方案1】:

您确定将 CSRF 令牌输出到您的表单吗?

{% csrf_token %}

需要在您的

标签之间。

一旦我这样做并修改了您的 check_username 视图以返回正确的 HTTP 响应,您的代码就为我工作了。

from django.http import HttpResponse
def check_username(request):
    username = request.POST.get('username', False)

    if not username:
        return HttpResponseBadRequest("Invalid username")
    return HttpResponse(User.objects.filter(username=username).exists())

【讨论】:

  • 我的表单标签之间确实有 csrf 令牌。有趣的是,您无需在 ajax 调用中传递 csrf 令牌即可使其工作
猜你喜欢
  • 2016-08-19
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 2014-10-12
  • 2012-01-26
  • 2021-05-20
  • 2017-06-05
相关资源
最近更新 更多