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
рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рдкреНрд░рддрд┐-рд╕рд╣рдЬ рд▓рдЧрддрд╛ рд╣реИред рдЖрдИрдбреА 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_ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣рдореЗрдВ рдЗрд╕ рддрдереНрдп рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓
has_object_permission
рд╣реА рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдЖрдкget_object
рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред