前端 ajax POST 调用无法登录 Django

Posted

技术标签:

【中文标题】前端 ajax POST 调用无法登录 Django【英文标题】:Frontend ajax POST call can't login to Django 【发布时间】:2013-02-24 15:27:33 【问题描述】:

我花了好几天都无济于事,想知道是否有人可以帮助我?我试图将 Django 用作后端,最终目标是移植到移动应用程序。我在前端有一个表单和 ajax 调用到 Django 中的 url/view(REST API 以及如果相关),但由于某种原因,我不明白该调用不会让我登录.

相关应用:

Django-Userena 好吃的

谁能告诉我正确的方向?下面是代码,谢谢!

index.html

<script>

$(document).ready(function()

`//login test`

`$('#login').submit(function()`

    $.ajax(
        url: 'http://127.0.0.1:8000/accounts/signin/',
        type: 'POST',
        //data: loginString,
        data: $('#login').serialize(),
        success: function() 
            alert('Test');
            $('#datadisplay').append("<h2>It worked</h2>");
        ,  
        error: function(errorThrown)
            alert('Error');
            alert(errorThrown);
        
    );
);

);

</script>

</head>

<body>

<div id="datadisplay"></div>
<input type="submit" id="getdata" value="Submit">

<div id="loginform">
 <form name="login" id="login" action="">
     <fieldset>
        <label for="id_identification">Username</label>
        <input type="text" name="identification" id="id_identification" size="30" value="" />
        <br/>

        <label for="id_password">Password</label>
        <input type="password" name="password" id="id_password" size="30" value="" />
        <br/>

        <input type="submit" name="submit" class="loginbutton" value="Login" />
    </fieldset>
</form>
</div>

api.py

class UserResource(ModelResource):

   class Meta:
       queryset = User.objects.all()
       resource_name = 'user'
       include_resource_uri = False
       allowed_methods = ['get', 'post']


def override_urls(self):
    return [url(r"^(?P<resource_name>%s)/signin%s$" %
    (self._meta.resource_name, trailing_slash()),
    self.wrap_view('signin'), name="api_signin"),
    ]

def signin(self, request, **kwargs):
    self.method_check(request, allowed=['post'])

    data = self.deserialize(request, request.raw_post_data, format=request.META.get('CONTENT_TYPE', 'application/json'))

    username = data.get('username', '')
    password = data.get('password', '')

    user = authenticate(username=username, password=password)

    if user:
        if user.is_active:
            login(request, user)
            return self.create_response(request, 
            'success': True
            )
        else:
            return self.create_response(request, 
            'success': False,
            'reason': 'disabled',
            , HttpForbidden )
    else:
        return self.create_response(request, 
        'success': False,
        'reason': 'incorrect',
        , HttpUnauthorized )

【问题讨论】:

你在使用 CSRF 框架吗?或者更确切地说,您是否在 settings.py 中禁用了它,因为您没有在 POST 调用中传递 CSRF 令牌? docs.djangoproject.com/en/dev/ref/contrib/csrf 你的 javascript 控制台打印的是什么?网络检查员对 AJAX 调用返回的数据有何看法? 感谢您查看我的代码。我将如何通过 ajax 传递 csrf 令牌,或者只是 django 端?通常它只是错误地取消 POST 请求,然后才能给出 xxx 号错误。当它确实通过时,它会向我打印 [object object] 的错误 【参考方案1】:
$.ajax(
    url: '/accounts/signin/',
    type: 'POST',
    data: 
        csrfmiddlewaretoken: 'csrf_token',
        //other variables
    ,
    success: function() 
        alert('Test');
        $('#datadisplay').append("<h2>It worked</h2>");
    ,  
    error: function(errorThrown)
        alert('Error');
        alert(errorThrown);
    
);

【讨论】:

以上是关于前端 ajax POST 调用无法登录 Django的主要内容,如果未能解决你的问题,请参考以下文章

使用触发 javascript 验证的 POST 表单和 AJAX 登录到 PHP 文件。无法将数据存储到 PHP

无法响应上下文处理器上的 AJAX 调用

ajax 调用会话超时

无法使用 JQuery Ajax Post 调用显示项目列表

POST 请求失败,无法登录

wordpress 中的 Ajax 调用不适用于前端站点的订阅者用户