如果条件为True,则装饰一个函数?

 博菡 发布于 2023-02-07 13:44

我想做类似于此的事情,这可以理解为导致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)

我怎样才能实现与此类似的东西?

2 个回答
  • 我不会为此编写装饰器 - 请注意,装饰器语法允许返回装饰器的函数调用(实际上,这是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):
        ...
    

    2023-02-07 13:46 回答
  • 当你使用这样的装饰器时:

    @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)
    

    2023-02-07 13:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有