我有一个装饰器,它允许请求仅通过列入白名单的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
答案 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。但它可能需要一些重构,这可能会很痛苦。所以我认为,用户中间件更好。这是为一堆视图添加一些特殊处理的简洁方法。