gpt4 book ai didi

django - 使用 angular 向 django-rest 发送 DELETE 请求被解释为 OPTIONS

转载 作者:行者123 更新时间:2023-12-01 06:31:34 25 4
gpt4 key购买 nike

我尝试使用带有 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)

我有一个 angular.service 来管理这个 $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 称为
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

仅供引用,我的 Angular 版本是 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/');

一切正常。

最佳答案

您可能需要相应地调整 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 token ,请不要忘记:
app.run(function($http) {
$http.defaults.headers.post['X-CSRFToken'] = $.cookie('csrftoken');
});

关于django - 使用 angular 向 django-rest 发送 DELETE 请求被解释为 OPTIONS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19855109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com