检查 Django 中的内部 IP。

3
我正在尝试创建一个函数,根据用户的IP地址返回TrueFalse,以确定其是否为内部或外部IP地址。我们希望内部用户能够看到更多内容并具有更多访问权限。我们希望以“低成本”的方式实现此目标。我知道如何查询一般IP,并使用条件逻辑针对元组进行操作。我想知道的是,Django是否可以为我完成大部分工作?
示例:
if request.is_internal():
    #Do Special Secret Internal Stuff Things!

我已经了解了一些关于Django的INTERNAL_IPS,但它似乎只用于调试,并且不允许我调用它。我错了吗?


您可以创建自定义的认证后端,并在登录时进行自定义处理,如果 settings.INTERNAL_IPS in request.META['REMOTE_ADDR'] - karthikr
1个回答

4

您最好创建一个视图装饰器,该装饰器将检查远程地址,然后在远程地址不在 settings.INTERNAL_IPS 中时引发 403 错误,代码如下:

import functools

from django.conf import settings
from django import http
from django.utils.decorators import method_decorator


def internal_or_403(view_func):
    """
    A view decorator which returns the provided view function,
    modified to return a 403 when the remote address is not in
    the list of internal IPs defined in settings.
    """
    @functools.wraps(view_func)
    def wrapper(request, *args, **kwargs):
        if not request.META['REMOTE_ADDR'] not in settings.INTERNAL_IPS:
            return http.HttpResponseForbidden('<h1>Forbidden</h1>')
        return view_func(request, *args, **kwargs)
    return wrapper


class Internal(object):
    """
    A mix-in for class based views, which disallows requests from
    non-internal IPs.
    """
    @method_decorator(internal_or_403)
    def dispatch(self, *args, **kwargs):
        return super(Internal, self).dispatch(*args, **kwargs)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接