Django-rest-framework: ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด๊ธฐ ์„ธํŠธ ๊ฒฝ๋กœ์—์„œ ๊ฐœ์ฒด ๊ถŒํ•œ์ด ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 05์›” 23์ผ  ยท  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()์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Documentation

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

get_object ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ has_object_permission ํ˜ธ์ถœ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  4 ๋Œ“๊ธ€

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()์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์ง๊ด€์ ์ด์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ ์–ด๋„ ๋ช…ํ™•ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฌธ์„œํ™”์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ํ’€ ์š”์ฒญ์„ ๊ณ ๋ คํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค . #๊ฐ์ฒด ์ˆ˜์ค€ ๊ถŒํ•œ

์ด๊ฒƒ์„ ๋‹ซ์ง€๋งŒ ์–ธ๊ธ‰๋œ ๋Œ€๋กœ ํŠน์ • ํ‘œํ˜„/์ถ”๊ฐ€๋ฅผ _ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค_.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰