web-dev-qa-db-ja.com

Django特定のメソッドのみにRESTフレームワーク権限を追加する方法は?

ユーザーモデルのRESTAPIには次の関数があります。 POSTリクエストのみにAllowAnyパーミッションを設定したい。誰かが私を助けてくれませんか。

class UserList(APIView):
    """Get and post users data."""

    def get(self, request, format=None):
        """Get users."""
        users = User.objects.all()
        serialized_users = UserSerializer(users, many=True)
        return Response(serialized_users.data)

    def post(self, request, format=None):
        """Post users."""
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
10
Ankit

IsPostOrIsAuthenticatedへの無制限のアクセスを許可する カスタム権限クラスPOSTを書くことができますリクエストしますが、認証されたGETリクエストのみを許可します。

カスタム権限IsPostOrIsAuthenticatedを実装するには、BasePermissionクラスをオーバーライドし、.has_permission(self, request, view)メソッドを実装します。メソッドは、リクエストにアクセスを許可する必要がある場合はTrueを返し、それ以外の場合はFalseを返す必要があります。

from rest_framework import permissions

class IsPostOrIsAuthenticated(permissions.BasePermission):        

    def has_permission(self, request, view):
        # allow all POST requests
        if request.method == 'POST':
            return True

        # Otherwise, only allow authenticated requests
        # Post Django 1.10, 'is_authenticated' is a read-only attribute
        return request.user and request.user.is_authenticated

したがって、すべてのPOSTリクエストには無制限のアクセスが許可されます。その他のリクエストについては、認証が必要になります。

次に、このカスタムアクセス許可クラスをグローバル設定に含める必要があります。

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'my_app.permissions.IsPostOrIsAuthenticated',
    )
}
25
Rahul Gupta

http://www.Django-rest-framework.org/api-guide/permissions/

上記のURLに従って、1つのカスタム権限クラスを作成する必要があります

class ExampleView(APIView):
    permission_classes = (MyCustomAuthenticated,)

POSTおよびGETに基づいてMyCUstomAuthenticated内でAllowAnyまたはIsAuthenticatedを使用して、独自のロジックを記述します

3