私は個人的にはDjangoフレームワークに来るとき、それは非常に慣用的ではありません、私の意見では、frankenmonsterカスタム権限のこの種を憎みます。 私は以下の解決策を考え出しました。@list_routeと@detail_routeデコレータがどのように動作するのかと非常によく似ています。あなたが見ることができるように
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
: 私たちはメソッド/関数は最初のクラスは、私は、このようなdectoratorを作成していますすべての
まずオブジェクトであるという事実に依存しています ミックスインを:それは今、私は、このようなミックスインを作成した引数リスト
として渡されたパラメータを飾る機能に辞書を追加します。 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は2つのことを行います。 get_permissionsが呼び出されたときに、それが実行される「アクション」チェック、およびget_serializer_classが呼び出されたとき、それは同じことを行い、 'をピックアップ
viewset.action_method.route_action_kwargsに関連付けられた「route_action_kwargs」からpermission_classesコレクションをlooksup route_action_kwargs 『
「から』シリアライザ今、私たちはそれを使用することができます方法:
@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)
カスタムroutseについては、我々は、明示的に、我々はちょうど方法に明示的に@route_action_argumentsを設定することができます定義されます。DRFの汎用ビューを使用した場合
ジェネリックビューセットや方法の面では、我々はまだ、常にその有用ではない @method_decoratorに
@method_decorator(route_action_arguments(serializer=LoginSerializer), name='create')
class UserViewSet (RouteActionArgumentsMixin, RequestContextMixin, viewsets.ModelViewSet):
django.contrib.authのデコレータを使用してそれらを追加することができます。かなり頻繁にHTTPメソッドを実装しないので、飾ることはありません。 DRF独自の権限システムを使用する方がよいでしょう。 http://django-rest-framework.org/api-guide/permissions.html –