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()์ ํธ์ถํ์ง ์์ต๋๋ค.
get_object
๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์๋ง has_object_permission
ํธ์ถ๋๋ค๋ ์ฌ์ค์ ๋ฌธ์ํํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ์ง๊ด์ ์ด์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. /api/object/123/method/์ ๊ฐ์ ํธ์ถ์ ์ผ๋ฐ์ ์ผ๋ก ID๊ฐ 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()์ด ํธ์ถ๋ฉ๋๋ค. ์ฌ์ ํ ์ง๊ด์ ์ด์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ ์ด๋ ๋ช ํํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๋ค.
๋๋ ๋ฌธ์ํ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ํ ์์ฒญ์ ๊ณ ๋ คํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค . #๊ฐ์ฒด ์์ค ๊ถํ
์ด๊ฒ์ ๋ซ์ง๋ง ์ธ๊ธ๋ ๋๋ก ํน์ ํํ/์ถ๊ฐ๋ฅผ _ํ ์ ์์ต๋๋ค_.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
get_object
๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์๋งhas_object_permission
ํธ์ถ๋๋ค๋ ์ฌ์ค์ ๋ฌธ์ํํด์ผ ํฉ๋๋ค.