Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何对所有管理视图使用装饰器_Python_Django - Fatal编程技术网

Python 如何对所有管理视图使用装饰器

Python 如何对所有管理视图使用装饰器,python,django,Python,Django,我有一个decorator,它只允许请求通过白名单上的一组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

我有一个decorator,它只允许请求通过白名单上的一组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

为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\u CLASSES
tuple中


另一种方法是使用户。但它可能需要一些重构,这可能是痛苦的。所以我认为,最好使用中间件。这是一种为一组视图添加一些特殊处理的简洁方法。

您是否尝试将其用作中间件?查看此博客帖子