0

我可以执行 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中?

PSCSRF_TOKEN之前声明过

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

和其他脚本。

4

3 回答 3

3

我已经弄清楚了问题所在。

默认情况下,Django 将斜杠附加到您的 URL。如果您输入:

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

Angular$resource删除了斜杠(你可以在 github 上阅读:https ://github.com/angular/angular.js/issues/992 )。

Django 有 APPEND_SLASH 设置,它使用 HTTP 302 重定向将斜杠附加到不带斜杠的 url。这适用于 GET 方法,但不适用于其他方法(POST、PUT、DELETE),因为重定向不能也不会将数据传递到新 URL

所以,有两种选择:

1)使用$httpinsread$resource

或者

2)在Django的settings.py添加这一行:

APPEND_SLASH = False

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

于 2013-05-28T02:12:26.423 回答
0

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

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

于 2013-05-28T11:30:28.093 回答
0

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

在你看来,有时会发生什么;您尝试将无法序列化的内容转储到您的字典中。那就是 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")
于 2013-07-31T10:47:45.673 回答