【问题标题】:How to check if decorator is present on view from Middleware如何从中间件检查装饰器是否存在
【发布时间】:2019-11-27 13:42:17
【问题描述】:

我有一个 django 应用程序,它需要为相当多的功能设置一个会话,我不想再担心检查它是否在视图中设置,所以我将它移动到中间件,但是,我仍然有一个需要从中间件中排除的视图很少。

我决定装饰不需要中间件的特定视图,但我不确定如何检查装饰器是否存在。这可能吗?

到目前为止,我已尝试将其绑定到请求变量,但不起作用。

class CheckPropertyMiddleware(object):

    def __init__(self, get_response):
        self.get_response = get_response

    @staticmethod
    def process_view(request, view_func, args, kwargs):
        print(request.property_not_important)
        if not request.session.get('property'):
            print('property not selected')
            messages.error(request, 'You need to select a property to use the system.')
            # return redirect(reverse('home', args=[request.client_url]))
        else:
            print('property selected')

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.
        return response


def property_not_important(function):
    @functools.wraps(function)
    def decorator(request, *args, **kwargs):
        request.property_not_important = True
        return function(request, *args, **kwargs)

    return decorator

【问题讨论】:

    标签: python django python-3.x python-decorators


    【解决方案1】:

    我想出了一个解决方案,它使用装饰器来禁用特定视图的中间件。

    这是在视图函数上设置属性并检查它是否存在的方法:

    def property_not_important(function):
        """
        Decorator
        """
        orig_func = function
        setattr(orig_func, 'property_not_important', True)
    
        return function
    
    
    class ExcludePropertyMiddleware(object):
        def __init__(self, get_response):
            self.get_response = get_response
    
        @staticmethod
        def process_view(request, view_func, view_args, view_kwargs):
            prop_not_important = getattr(view_func, 'property_not_important', False)
            if prop_not_important:
                print('property not important')
                return view_func(request, *view_args, **view_kwargs)
            return None
    
        def __call__(self, request):
            response = self.get_response(request)
            return response
    

    这是一个检查方法名称的解决方案:

    class ExcludePropertyMiddleware(object):
        def __init__(self, get_response):
            self.get_response = get_response
    
        @staticmethod
        def process_view(request, view_func, view_args, view_kwargs):
            if view_func.__name__ == "_property_not_important":
                return view_func(request, *view_args, **view_kwargs)
            return None
    
        def __call__(self, request):
            response = self.get_response(request)
            return response
    
    

    settings.py

    MIDDLEWARE = [
        ...
        'utils.middleware.CheckPropertyMiddleware.ExcludePropertyMiddleware',
        # allow exclusion
        'utils.middleware.CheckPropertyMiddleware.CheckPropertyMiddleware',
    ]
    

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 2011-07-26
      • 2011-05-30
      • 2012-04-05
      • 2019-02-11
      • 2015-05-27
      • 2011-12-02
      • 1970-01-01
      • 2015-11-10
      相关资源
      最近更新 更多