Şahsen Django çerçevesine gelince çok deyimsel değil, bence, frankenmonster özel izinlerle bu tür nefret; Bu yüzden şu çözümle geldim - bu, @list_route ve @detail_route dekoratörlerinin nasıl çalıştığına çok benziyor. Gördüğünüz gibi
decorators.py
def route_action_arguments(**kwargs):
"""
Add arguments to the action method
"""
def decorator(func):
func.route_action_kwargs = kwargs
return func
return decorator
: Biz yöntemler/fonksiyonlar birinci sınıf Böyle dectorator yaratıyorum tüm
İlk nesneleri olmasına güvenerek Bu,
arg listesi olarak iletilen parametrelerle süslediği işleve bir sözlük ekler. Şimdi böyle bir karışım oluşturdum: karışımları. py
class RouteActionArgumentsMixin (object):
"""
Use action specific parameters to
provide:
- serializer
- permissions
"""
def _get_kwargs(self):
action = getattr(self, 'action')
if not action:
raise AttributeError
print('getting route kwargs for action:' + action)
action_method = getattr(self, action)
kwargs = getattr(action_method, 'route_action_kwargs')
print(dir(kwargs))
return kwargs
def get_serializer_class(self):
try:
kwargs = self._get_kwargs()
return kwargs['serializer']
except (KeyError, AttributeError):
return super(RouteActionArgumentsMixin, self).get_serializer_class()
def get_permissions(self):
try:
kwargs = self._get_kwargs()
return kwargs['permission_classes']
except (KeyError, AttributeError):
return super(RouteActionArgumentsMixin, self).get_permissions()
Mixin iki şey yapar; get_permissions çağrıldığında , bu eylem 'yürütüldüğü denetler ve gelen permission_classes koleksiyonunu arayacağını 'route_action_kwargs' viewset.action_method.route_action_kwargs ile ilişkili
get_serializer_class çağrıldığında, aynı yapar ve' alır
route_action_kwargs '
Şimdi yoldan 'dan' serileştirici bunu kullanabilirsiniz:
@method_decorator(route_action_arguments(serializer=LoginSerializer), name='create')
class UserViewSet (RouteActionArgumentsMixin, RequestContextMixin, viewsets.ModelViewSet):
"""
User and profile managment viewset
"""
queryset = User.objects.all()
serializer_class = UserSerializer
@list_route(methods=['post'])
@route_action_arguments(permission_classes=(AllowAny,), serializer=LoginSerializer)
def login(self, request):
serializer = self.get_serializer_class()(data=request.data)
özel biz açıkça biz sadece yöntem üzerinde açıkça @route_action_arguments ayarlayabilirsiniz tanımlamak routse.DRF en jenerik görünümleri kullanılırken
jenerik viewsets ve yöntemleri açısından, hala her zaman bu yararlı olmayan @method_decorator
@method_decorator(route_action_arguments(serializer=LoginSerializer), name='create')
class UserViewSet (RouteActionArgumentsMixin, RequestContextMixin, viewsets.ModelViewSet):
django.contrib.auth en dekoratörler kullanarak ekleyebilirsiniz. Çoğunlukla HTTP yöntemlerini hiç uygulamıyorsunuz - dolayısıyla dekore edilecek hiçbir şey yok. (Sadece onları dekore etmek için onları veya gönderimi uygulamak eğlenceli değildir.) Bu durumda DRF'in kendi izin sistemini kullanmak daha iyidir. http://django-rest-framework.org/api-guide/permissions.html –