我尝试使用带有angularjs的django-rest构建的rest API,但我遇到了问题。 当我发送DELETE请求时,django-rest会看到OPTIONS。
这就是我所做的:
我的Django views.py
@api_view(['GET', 'PUT', 'DELETE'])
def node_detail(request, pk):
"""
Retrieve, update or delete a node.
"""
try:
node = Node.objects.get(pk=pk)
except Node.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = NodeSerializer(node)
return Response(serializer.data)
elif request.method == 'PUT':
data = JSONParser().parse(request)
serializer = NodeSerializer(node, data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
node.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
我添加了带有django-cors-headers的CORS并且接受了所有Origins(CORS_ORIGIN_ALLOW_ALL = True)
我有一个角色服务来管理这个$ resource
angular.module('akilio.nodes.services', ['ngResource'])
.factory('NodeServices', function($resource){
return $resource('http://127.0.0.1:8000/nodes/:nodeId/', {nodeId: '@nodeId'});
});
现在,使用ng-click =“deleteNode()”按钮,我调用此控制器
controller('DetailCtrl', ['$scope', '$routeParams', 'NodeServices', function($scope, $routeParams, NodeServices) {
$scope.node = NodeServices.get({nodeId: $routeParams.pk});
$scope.deleteNode = function(){
$scope.node.$delete(function(){
console.log('ok');
}, function(){
console.log('nok');
});
};
}]);
console.log()每次都返回“nok”,在我的django控制台中,我看到了
[08/Nov/2013 09:39:10] "OPTIONS /nodes HTTP/1.1" 301 0
FYi,我的角度版本是v1.2.0-rc.3然后我已添加到我的应用程序
config(['$sceDelegateProvider', function($sceDelegateProvider) {
$sceDelegateProvider.resourceUrlWhitelist(['self', 'http://127.0.0.1']);
}])
但没有改变:(
一个想法?
修改
我认为问题来自$ resource,也许我在实施中错了。 我试图用$ http而不是像
这样的$ resource删除一个节点$http.delete('http://127.0.0.1:8000/nodes/4/');
一切都很好。
答案 0 :(得分:0)
您可能需要相应地调整django设置:
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = ('127.0.0.1:8000', )
SESSION_COOKIE_DOMAIN = '127.0.0.1'
CSRF_COOKIE_DOMAIN = '127.0.0.1'
另外,如果你使用csrf令牌,那么不要忘记这一点:
app.run(function($http) {
$http.defaults.headers.post['X-CSRFToken'] = $.cookie('csrftoken');
});
答案 1 :(得分:0)
实际上问题来自Django,它增加了一个试验空间。
然后当angular尝试获取http://test/url
但django将其重定向到http://test/url/
时
这种重定向意味着数据丢失。
我的解决方案是this modification到resource.js文件。
其他解决方案都是可能的,Django将APPEND_SLASH视为False