前端 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