我想做类似于此的事情,这可以理解为导致SyntaxError:
@api_view(['GET']) if settings.USE_API_KEY: @authentication_classes((TokenAuthentication, )) @permission_classes((IsAuthenticated, )) def all_announcements(request): announcements = Announcement.objects.all() serializer = AnnouncementSerializer(announcements, many=True) return Response(serializer.data)
我怎样才能实现与此类似的东西?
我不会为此编写装饰器 - 请注意,装饰器语法允许返回装饰器的函数调用(实际上,这是decorators-with-parameters实际执行的操作).所以:
def maybe_decorate(condition, decorator): return decorator if condition else lambda x: x @api_view(['GET']) @maybe_decorate(settings.USE_API_KEY, authentication_classes((TokenAuthentication, ))) @maybe_decorate(settings.USE_API_KEY, permission_classes((IsAuthenticated, ))) def all_announcements(request): ...
当你使用这样的装饰器时:
@decorator def f(): ...
它相当于:
def f(): ... f = decorator(f)
考虑到这一点,你可以完成你想要的东西:
def all_announcements(request): announcements = Announcement.objects.all() serializer = AnnouncementSerializer(announcements, many=True) return Response(serializer.data) if settings.USE_API_KEY: all_announcements = permission_classes((IsAuthenticated,))(all_announcements) all_announcements = authentication_classes((TokenAuthentication,))(all_announcements) all_announcements = api_view(['GET'])(all_announcements)