如何将装饰器用于所有管理视图

时间:2016-02-22 10:39:17

标签: python django

我有一个装饰器,它允许请求仅通过列入白名单的IP集来获取。如何在代码更改最少的情况下将其插入所有管理视图。

这是装饰师。

def allow_by_ip(view_func):
    def authorize(request, *args, **kwargs):
        user_ip = request.META['REMOTE_ADDR']
        if user_ip in WHITELIST_IP_INTERNAL_ADMIN:
            return view_func(request, *args, **kwargs)
        return Response({'error': 'Not allowed!'}, status.HTTP_403_FORBIDDEN)
    return authorize

1 个答案:

答案 0 :(得分:0)

为django创建自定义中间件会更好更清晰,您可以在其中检查所请求的路径,如果是管理路径,您的代码将检查IP对白名单。

您可以创建类似whitelist_middleware.py的文件:

class WhitelistIPMiddleware(object):
    def process_request(self, request):
       request_ip = request.META.get('REMOTE_ADDR', None)
       if request_ip not in WHITELIST_IP_INTERNAL_ADMIN:
          raise Http403 # or 404, if you want
       return None

使用settings.py将该文件放入同一目录中(默认情况下,如果没有中间件的特殊目录)。然后将其添加到settings.py中的MIDDLEWARE_CLASSES元组中。

另一种方式是用户class-based views。但它可能需要一些重构,这可能会很痛苦。所以我认为,用户中间件更好。这是为一堆视图添加一些特殊处理的简洁方法。