4

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 を追加しました。すべてのオリジンが受け入れられます (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

参考までに、私のAngularバージョンはv1.2.0-rc.3で、アプリに追加しました

config(['$sceDelegateProvider', function($sceDelegateProvider) {
     $sceDelegateProvider.resourceUrlWhitelist(['self', 'http://127.0.0.1']);
 }])

しかし、何も変わっていません:(

アイデア ?

編集

問題は $resource にあると思います。実装が間違っているのかもしれません。$resource の代わりに $http を使用してノードを削除しようとしました

$http.delete('http://127.0.0.1:8000/nodes/4/');

そしてすべてが大丈夫です。

4

2 に答える 2

0

実際、問題は試用スペースを追加する Django に由来します。次に、角度が取得しようとするとhttp://test/url、django がそれをリダイレクトしhttp://test/url/ ます。このリダイレクトは、データが失われていることを意味します。

私の解決策は、このresource.jsファイルへの変更でした。

APPEND_SLASH が False の Django 側では、他の解決策も可能です。

于 2013-11-14T14:04:28.237 に答える
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');
});
于 2013-11-08T12:14:26.067 に答える