django + angularjs resource + ajax POST = 500(内部服务器错误)

时间:2013-05-28 01:48:39

标签: ajax django post angularjs

我可以执行GET请求,但是当我执行POST时,在Chrome开发人员工具中,我看到:“无法加载资源:服务器响应状态为500(内部服务器错误)”

我认为问题出在Django的csrf_token中,所以我找到了这个解决方案:

.config(function($httpProvider){
    $httpProvider.defaults.headers.common['X-CSRFToken'] = CSRF_TOKEN;
});

在我的index.html中,<head>我有:

<script>
    CSRF_TOKEN = '{{ csrf_token }}';
</script>

但它仍然会引发500错误。我做错了什么或问题不在csrf中?

P.S。在{/ p>之前宣布CSRF_TOKEN

<script src="{{ STATIC_URL }}lib/angular/angular.js"></script>

和其他脚本。

3 个答案:

答案 0 :(得分:3)

我已经发现了问题。

Django默认会将斜杠添加到您的URL。如果输入:

http://mydjangosite.com/page Django会将您重定向到:http://mydjangosite.com/page/

Angular的$resource删除尾部斜杠(您可以在github上阅读它:https://github.com/angular/angular.js/issues/992)。

  

Django有APPEND_SLASH设置,它使用HTTP 302重定向   在没有斜线的情况下向网址添加斜线。这适用于GET方法,但不适用   与其他人(POST,PUT,DELETE)因为重定向不能也不会   将数据传递给新网址

所以,有两种选择:

1)使用$http

$resource信息

2)在Django的settings.py中添加以下行:

APPEND_SLASH = False

并在urls.py删除所有尾部斜杠

答案 1 :(得分:0)

只需转义反斜杠,例如:/ custom_api / get_nearest_hotels /:eventId \ /

(来自:http://pragmaticstartup.wordpress.com/2013/04/27/some-lessons-learnt-from-messing-with-django-and-angularjs/

答案 2 :(得分:0)

众所周知,您需要在HTTPRESPONCE对象中转储字典。

有时会发生什么,在你看来;你试图将某些内容转储到无法序列化的dict中。即python / django无法序列化该对象。

示例可以是(FORM OBJECT),(MODEL OBJECT)等

所以你需要把它们拿走。

context = {}
context['office_form'] = OfficeCompleteForm(request.POST)

这不能序列化,你会得到500错误。

可以自由添加以下数据。

 context['success'] = {"msg": "successfully updated. "}
 context['error'] = {"msg": "error can not update. "}

最后不要忘记给你这样的回复方法。

return HttpResponse(json.dumps(context), content_type="application/json")