代码之家  ›  专栏  ›  技术社区  ›  Greg

写一个奇瑞派装饰师授权

  •  6
  • Greg  · 技术社区  · 15 年前

    我有一个Cherrypy应用程序,在一些视图上,我想开始只允许某些用户查看它们,并将其他人发送到需要授权的页面。

    有没有一种方法可以用一个定制的装饰器来做这个?我认为这是最优雅的选择。

    下面是我要做的基本示例:

    class MyApp:
        @authorization_required
        def view_page1(self,appID):
            ... do some stuff ...
            return html
    
    def authorization_required(func):
        #what do I put here?
    

    当作为装饰器调用时,authorization-required函数是否可以接受allow_group1、allow_group2等参数?或者我需要一个单独的装饰师为每个小组?

    2 回复  |  直到 9 年前
        1
  •  4
  •   Wolph    11 年前

    好的,在这种情况下,你的装饰师会看起来像这样:

    # without any parameters
    def authentication_required(f):
        @functools.wraps(f)
        def _authentication_required(*args, **kwargs):
            # Do you login stuff here
            return f(*args, **kwargs)
        return _authentication_required
    
    # With parameters
    def authentication_required(*allowed_groups):
        def _authentication_required(f):
            @functools.wraps(f)
            def __authentication_required(*args, **kwargs):
                # Do you login stuff here
                return f(*args, **kwargs)
            return __authentication_required
        return _authentication_required
    
        2
  •  13
  •   The Tahaan    9 年前

    你真的不想为奇瑞写定制的装饰。相反,您希望编写一个新工具:

    def myauth(allowed_groups=None, debug=False):
        # Do your auth here...
        authlib.auth(...)
    cherrypy.tools.myauth = cherrypy.Tool("on_start_resource", myauth)
    

    http://docs.cherrypy.org/en/latest/extend.html#tools 更多讨论。与编写自定义装饰器相比,这有几个好处:

    1. 你可以从工具中免费获得装饰: @cherrypy.tools.myauth(allowed_groups=['me']) 它已经知道如何不在同一个函数上击倒Cherrypy.exposed。
    2. 您可以为每个处理程序(使用decorator)、每个控制器树(通过 _cp_config )或每个URI树(在配置文件或dict中)。您甚至可以混合使用它们,通过装饰器提供基本特性,然后在配置文件中覆盖它们的行为。
    3. 如果一个配置文件关闭了您的特性,那么您不必为调用decorator函数来查看它是否关闭而支付性能损失。
    4. 您将记得像所有内置工具一样添加一个“debug”参数。;)
    5. 通过选择不同的“点”,您的特性可以比自定义装饰器运行得更早(如果您需要的话,也可以更晚)。
    6. 您的功能可以运行在 倍数 钩点,如果需要。