Python 如何对所有管理视图使用装饰器
我有一个decorator,它只允许请求通过白名单上的一组IP。如何在代码更改最少的情况下为所有管理视图插入它 这是装修工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
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中
另一种方法是使用户。但它可能需要一些重构,这可能是痛苦的。所以我认为,最好使用中间件。这是一种为一组视图添加一些特殊处理的简洁方法。您是否尝试将其用作中间件?查看此博客帖子