ভিউসেট, জ্যাঙ্গো-রেস্ট-ফ্রেমওয়ার্কে একটি পদ্ধতি অক্ষম করুন


124

ViewSets তালিকাবদ্ধকরণ, পুনরুদ্ধার, তৈরি, আপডেট, মোছা, ...

আমি তাদের মধ্যে কিছু অক্ষম করতে চাই, এবং যে সমাধানটি আমি নিয়ে এসেছি তা সম্ভবত একটি ভাল নয়, যেহেতু OPTIONSএখনও তাদের অনুমতি অনুসারে বলা হয়েছে।

এটি সঠিক উপায়ে কীভাবে করবেন সে সম্পর্কে কোনও ধারণা?

class SampleViewSet(viewsets.ModelViewSet):
    queryset = api_models.Sample.objects.all()
    serializer_class = api_serializers.SampleSerializer

    def list(self, request):
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
    def create(self, request):
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

উত্তর:


250

এর সংজ্ঞাটি ModelViewSetহ'ল:

class ModelViewSet(mixins.CreateModelMixin, 
                   mixins.RetrieveModelMixin, 
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet)

সুতরাং প্রসারিত করার চেয়ে ModelViewSet, আপনার যা প্রয়োজন কেবল তা ব্যবহার করবেন না কেন? উদাহরণস্বরূপ:

from rest_framework import viewsets, mixins

class SampleViewSet(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    viewsets.GenericViewSet):
    ...

এই পদ্ধতির সাথে, রাউটারটি কেবল অন্তর্ভুক্ত পদ্ধতিগুলির জন্য রুট তৈরি করা উচিত।

তথ্যসূত্র :

ModelViewSet


@ সানি সাইডআপ কেবল এখনই এটি চেষ্টা করছে এবং দেখে মনে হচ্ছে যে রাউটারটি একটি তালিকা দেখার জন্য রুটটি তৈরি করে, তবে এটি 404 কারণ ভিউসেট অনুরোধটি কীভাবে পরিচালনা করবেন তা জানেন না। আপনি কি এটি প্রত্যাশা করেছিলেন?
স্টিভ জলিম

3
কেবলমাত্র মিক্সিনগুলি ব্যবহারের মাধ্যমে আপনি জিইটি, পোস্ট, পুট, পদ্ধতিগুলি মুছে ফেলতে পারবেন তবে আপনি রাউটারগুলি ব্যবহার করছেন তবে বিশেষত কীভাবে প্যাচচ পদ্ধতিটি অক্ষম করতে হবে তা আমি খুঁজে পাইনি।
মুনিব আহমাদ

3
@ মুনিবআহমাদ প্যাচ পদ্ধতিটি থেকে সক্ষম করা হয়েছে UpdateModelMixin। আপনি যদি প্যাচটি না করে আপডেট ব্যবহার করতে চান তবে আমি বর্তমানে দুটি উপায় নিয়ে ভাবতে পারি। হয় আপনি ভিউতে অনুমোদিত পদ্ধতিগুলিকে ওভাররাইড করতে পারেন এবং "প্যাচ" মুছে ফেলতে পারেন বা আপনি partial_updateপদ্ধতি ও কলকে ওভাররাইড করতে পারেন http_method_not_allowed(request, *args, **kwargs)। আমি এটি পরীক্ষা করেছি না তাই এটি কাজ করে কিনা তা সম্পর্কে আমি নিশ্চিত নই
সানি সাইডইউপি

1
@ জুলিওমারিনস আমি একটি রেফারেন্স যুক্ত করেছি। আমি নিশ্চিত নই যে আপনি যা চেয়েছিলেন এটি এটি ছিল কিনা।
সানি সাইডইউপ

1
যদি কেউ কেবল পঠনযোগ্য ভিউসেট তৈরি করতে চায় তবে তারা ব্যবহার করতে পারে class SampleViewSet(viewsets.ReadOnlyModelViewSet)
বিকাশ খারেল

133

আপনি আপনার ভিউসেটটিতে ব্যবহার viewsets.ModelViewSetএবং সংজ্ঞা রাখতে পারেন http_method_namescould

উদাহরণ

class SampleViewSet(viewsets.ModelViewSet):
    queryset = api_models.Sample.objects.all()
    serializer_class = api_serializers.SampleSerializer
    http_method_names = ['get', 'post', 'head']

একবার আপনি যোগ http_method_names, আপনাকে যা করতে হবে সক্ষম হবে না putএবং patchআর।

যদি আপনি চান putতবে চান না patch, আপনি রাখতে পারেনhttp_method_names = ['get', 'post', 'head', 'put']

অভ্যন্তরীণভাবে, ডিআরএফ ভিউগুলি জাজানো সিবিভি থেকে প্রসারিত। জ্যাঙ্গো সিবিভি-তে একটি_বিধিত্ব আছে যাঁকে HT_Modod_names বলা হয়। সুতরাং আপনিও ডিআরএফ ভিউ সহ http_method_names ব্যবহার করতে পারেন।

[নির্লজ্জ প্লাগ]: যদি এই উত্তরটি সহায়ক হয় তবে আপনি ডিআরএফ-এ আমার পোস্ট সিরিজটি https://www.agiliq.com/blog/2019/04/drf-polls/ এ পছন্দ করতে পারেন ।


16
এইভাবে সমস্যা হয় না হয় তালিকা অক্ষম করার বা পুনরুদ্ধার করার উপায় way উভয় নিষ্ক্রিয় করতে বা তন্ন তন্ন আছে
ফুয়াদ

1
এটি আমার পক্ষে কাজ করে নি, পেতে এবং মাথা যোগ করার পরেও আমি এখনও একটি পোস্ট করতে
পেরেছিলাম

এটি আমার জন্য জাজানো ১.৯ এ কাজ করে। দুর্দান্ত সমাধান। ব্যবহারকারীরা কি অন্যভাবে জিইটি অনুরোধ করতে পারে এমন ঝুঁকি রয়েছে?
ইয়কন

উদ্ভট সমাধান। কাজ করে python3এবং Django 1.10ঠিক আছে।
উর্দা

2
আমি এই পদ্ধতির পছন্দ করি কারণ আমি প্যাচএইচসি অন্তর্ভুক্ত করার জন্য মিক্সিনগুলির উত্তরাধিকার পরিবর্তন করতে পারি না, তবে mixins.UpdateModelMixin
পিইটিটি করি

5

যদিও এই পোস্টটির জন্য এটি কিছুটা সময় হয়ে গেছে, আমি হঠাৎ করে জানতে পারি যে আসলে সেইগুলি সেই ফাংশনটি অক্ষম করার একটি উপায়, আপনি এটিকে সরাসরি ভিউ.পিতে সম্পাদনা করতে পারেন।

সূত্র: https://www.django-rest-framework.org/api-guide/viewsets/#viewset-tives

from rest_framework import viewsets, status
from rest_framework.response import Response

class NameWhateverYouWantViewSet(viewsets.ModelViewSet):

    def create(self, request):
        response = {'message': 'Create function is not offered in this path.'}
        return Response(response, status=status.HTTP_403_FORBIDDEN)

    def update(self, request, pk=None):
        response = {'message': 'Update function is not offered in this path.'}
        return Response(response, status=status.HTTP_403_FORBIDDEN)

    def partial_update(self, request, pk=None):
        response = {'message': 'Update function is not offered in this path.'}
        return Response(response, status=status.HTTP_403_FORBIDDEN)

    def destroy(self, request, pk=None):
        response = {'message': 'Delete function is not offered in this path.'}
        return Response(response, status=status.HTTP_403_FORBIDDEN)

এটি একটি পছন্দনীয় উপায় হতে হবে।
ডিজিটাকে

আমি মনে করি HTTP_400_BAD_REQUEST এখানে লেখার সাথে সম্পর্কিত না হলে আরও উপযুক্ত হবে।
সান্তিয়াগো মাগারিওস

4

আপনি যদি ডিআরএফ ভিউসেট থেকে পুট পদ্ধতিটি অক্ষম করার চেষ্টা করছেন তবে আপনি একটি কাস্টম রাউটার তৈরি করতে পারেন:

from rest_framework.routers import DefaultRouter

class NoPutRouter(DefaultRouter):
    """
    Router class that disables the PUT method.
    """
    def get_method_map(self, viewset, method_map):

        bound_methods = super().get_method_map(viewset, method_map)

        if 'put' in bound_methods.keys():
            del bound_methods['put']

        return bound_methods

রাউটারে পদ্ধতিটি অক্ষম করে, আপনার এপিআই স্কিমা ডকুমেন্টেশন সঠিক হবে।


আংশিক প্যাচ সঠিকভাবে DRF ভর্তি মধ্যে বাস্তবায়িত হয়নি এটা বিজ্ঞতার কাজ হবে ভাবে বিশ্বব্যাপী এটা মুছে ফেলার জন্য এখানে বর্ণিত
Oden

1

ডিআরএফ-এ ভিউসেটের জন্য "ডিলেট" পদ্ধতিটি কীভাবে অক্ষম করবেন

class YourViewSet(viewsets.ModelViewSet):
    def _allowed_methods(self):
        return [m for m in super(YourViewSet, self)._allowed_methods() if m not in ['DELETE']]

PS এটি সমস্ত প্রয়োজনীয় পদ্ধতি স্পষ্টভাবে উল্লেখ করার চেয়ে নির্ভরযোগ্য, সুতরাং কয়েকটি গুরুত্বপূর্ণ পদ্ধতি অপশন, হেড ইত্যাদি ভুলে যাওয়ার সম্ভাবনা কম রয়েছে PS

ডিপিএল পিপিএসের ডিআরএফ রয়েছে http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']


আপনি superক্লাস স্তরে কল করতে পারবেন না , নেই self
বৈধ নামটি

0

জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্ক ৩.০ এক্সএক্স-এ আপনি ModelViewSetকোনও অভিধানে একটি as_viewপদ্ধতি পাস করে আপনি সক্ষম করতে চান এমন প্রতিটি পদ্ধতি সহজভাবে সক্ষম করতে পারেন । এই অভিধানে, কীটিতে অবশ্যই অনুরোধের ধরণ থাকতে হবে (জিইটি, পোষ্ট, ডিলেট, ইত্যাদি) এবং মানটিতে অবশ্যই সংশ্লিষ্ট পদ্ধতির নাম (তালিকা, পুনরুদ্ধার, আপডেট ইত্যাদি) থাকতে হবে। উদাহরণস্বরূপ বলুন আপনি Sampleমডেল তৈরি করতে বা পড়তে চান তবে আপনি এটি পরিবর্তন করতে চান না। সুতরাং এর অর্থ আপনি চান list, retrieveএবংcreate পদ্ধতি সক্ষম হতে (এবং আপনি অন্যদের অক্ষম হতে চাই।)

আপনাকে যা করতে হবে তা হল urlpatternsএগুলি পছন্দ করার জন্য পাথ যুক্ত করা :

path('sample/', SampleViewSet.as_view({
    'get': 'list',
    'post': 'create'
})),
path('sample/<pk>/', SampleViewSet.as_view({  # for get sample by id.
    'get': 'retrieve'
}))

আপনি দেখতে পাচ্ছেন যে উপরের রাউটিং সেটিংসে কোনও অনুরোধ নেই deleteএবং putঅনুরোধ রয়েছে, উদাহরণস্বরূপ আপনি যদি puturl এ একটি অনুরোধ প্রেরণ করেন তবে এটি আপনাকে 405 দিয়ে সাড়া দেয় Method Not Allowed:

{
    "detail": "Method \"PUT\" not allowed."
}

0

আপনি যদি পুট / পোস্ট / ধ্বংস পদ্ধতিগুলি অক্ষম করার পরিকল্পনা করে থাকেন তবে আপনি ব্যবহার করতে পারেন

ভিউসেটস.আরেডওনলি মডেলভিউসেট https://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/#refactoring-to- ব্যবহার- পর্যালোচনাগুলি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.