Django-rest-framework: рдХрд╕реНрдЯрдо рд╡реНрдпреВрд╕реЗрдЯ рдорд╛рд░реНрдЧреЛрдВ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 23 рдордИ 2016  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: encode/django-rest-framework

рдкреНрд░рдЬрдирди рдХреЗ рдЪрд░рдг

class MyViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MySerializer
    authentication_classes = (MyAuth, )
    permission_classes = (MyPermissions, )

    @detail_route(methods=["GET", ])
    def custom(self, request, pk=None):
        return Response('whatever')

from rest_framework import routers
router = routers.SimpleRouter() 
router.register('mymodel', MyViewSet)
urlpatterns = [
    url(r'^api/', include(router.urls)),
]

/api/mymodel/123/custom/ рдХреЗ рд▓рд┐рдП рдПрдХ GET рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░

has_object_permission() рдХреЛ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ MyModel.objects.get(pk=123) рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░

/api/mymodel/123/custom/ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╕реНрдЯрдо рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз MyPermissions рдореЗрдВ has_permission() рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди has_object_permission() рдирд╣реАрдВ, рднрд▓реЗ рд╣реА рдпрд╣ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдорд╛рд░реНрдЧ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рдореЗрдВ рдЗрд╕ рддрдереНрдп рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ has_object_permission рд╣реА рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдЖрдк get_object рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рдореЗрдВ рдЗрд╕ рддрдереНрдп рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ has_object_permission рд╣реА рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдЖрдк get_object рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдкреНрд░рддрд┐-рд╕рд╣рдЬ рд▓рдЧрддрд╛ рд╣реИред рдЖрдИрдбреА 123 рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкрд░ рдХреБрдЫ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░/рдПрдкреАрдЖрдИ/рдСрдмреНрдЬреЗрдХреНрдЯ/123/рд╡рд┐рдзрд┐/ рдЬреИрд╕реЗ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐ рдХреА рдЬрд╛рдВрдЪ рдПрдХ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛ред рдЕрдиреНрдпрдерд╛ рд╣рд░ рдмрд╛рд░ рдЬрдм рдХреЛрдИ рдХрд╕реНрдЯрдо рд╡рд┐рд╡рд░рдг рдорд╛рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╡рд╕реНрддреБ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреА рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЙрд╕ рд╕рдордп, has_object_permission() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рддреЛ рд╣рд░ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдЬрд╣рд╛рдВ рд╡рд╕реНрддреБ рд╕реНрддрд░ рдХреА рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреБрдЫ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

class CustomPermission(BasePermission):
    def has_permission(self, request, view):
        """we need to do all permission checking here, since has_object_permission() is not guaranteed to be called"""
        if 'pk' in view.kwargs and view.kwargs['pk']:
            obj = view.get_queryset()[0]
            # check object permissions here
        else:
            # check model permissions here

    def has_object_permission(self, request, view, obj):
        """ nothing to do here, we already checked everything, so ignore """
        return True

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдореИрдВ рдЕрдм рд╕рдордЭ рдЧрдпрд╛ред рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ get_object() рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, has_object_permission() рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрднреА рднреА рдкреНрд░рддрд┐-рд╕рд╣рдЬ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рд╣реИред

рдореБрдЭреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдареЛрд╕ рдкреБрд▓-рдЕрдиреБрд░реЛрдз рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдЦрдбрд╝рд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЬреЛ рдорд┐рд▓рд╛ рд╣реИ рд╡рд╣ http://www.django-rest-framework.org/api-guide/permissions/ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ

рдЗрд╕реЗ рдмрдВрдж рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рд╡рд┐рдЦреНрдпрд╛рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реАрдлрд╝реНрд░реЗрд╢рд┐рдВрдЧ/рдЬреЛрдбрд╝ _could_ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Lucidiot picture Lucidiot  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

snbuback picture snbuback  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mrodal picture mrodal  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

orf picture orf  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

akhilputhiry picture akhilputhiry  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ