前端 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的主要内容,如果未能解决你的问题,请参考以下文章