2013-05-28 173 views
0

我可以做GET請求,但是當我做POST時,在Chrome開發人員工具中,我看到:「無法加載資源:服務器響應狀態爲500 (內部服務器錯誤)」django + angularjs資源+ ajax POST = 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. CSRF_TOKEN之前聲明

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

和其他腳本。

+0

500內部服務器錯誤不是太有用。 Django拋出的確切錯誤是什麼? – Blender

+0

@Blender,我怎麼看?我想我需要一些'錯誤'功能在Angular – imkost

+0

問題是通過使用$ http而不是$資源解決的 – imkost

回答

3

我已經知道了這個問題。

默認情況下,Django將斜槓添加到您的URL中。如果輸入:

http://mydjangosite.com/page Django會重定向到:http://mydjangosite.com/page/

角的$resource消除斜線(你可以在github上讀到它:https://github.com/angular/angular.js/issues/992)。

Django具有APPEND_SLASH設置,該設置使用HTTP 302重定向到 將斜槓附加到不帶斜槓的URL。這適用於GET方法,但與他人(POST,PUT,DELETE),因爲重定向不能,也不會 將數據傳遞到新的URL

所以不 ,有兩種選擇:

1)使用$http insread的$resource

2)在Django的settings.py加入這一行:

APPEND_SLASH = False 

,並在您urls.py刪除所有尾隨斜線

0

大家都知道你需要在HTTPRESPONCE對象中轉儲字典。

有時會發生什麼,在你看來;您嘗試將某些內容轉儲到無法序列化的字典中。那是python/django無法序列化該對象。

的例子可以(表單對象),(模型對象)等

,所以你需要讓那些離開。

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") 
相關問題