我可以执行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>
和其他脚本。
答案 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 \ /
答案 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")