Django ALLOWED_HOSTS IPs范围

时间:2016-05-04 15:12:39

标签: django django-settings

有没有办法在django中设置ALLOWED_HOSTS IP的范围?

这样的事情:

ALLOWED_HOSTS = ['172.17.*.*']

5 个答案:

答案 0 :(得分:18)

不,目前无法实现。根据{{​​3}},支持以下语法:

['www.example.com']  # Fully qualified domain
['.example.com']  # Subdomain wildcard, matches example.com and www.example.com 
['*']  # Matches anything

如果查看the docs方法的实现,可以看到不支持使用*作为通配符。

答案 1 :(得分:17)

我在Django上发了一张票但是我看到这可以通过以下方式实现

from socket import gethostname, gethostbyname 
ALLOWED_HOSTS = [ gethostname(), gethostbyname(gethostname()), ] 

https://code.djangoproject.com/ticket/27485

答案 2 :(得分:8)

这是一个快速而肮脏的解决方案。

ALLOWED_HOSTS += ['172.17.{}.{}'.format(i,j) for i in range(256) for j in range(256)]

答案 3 :(得分:8)

Mozilla发布了一个名为django-allow-cidr的Python软件包,旨在解决这个问题。

announcement blog post解释说,它对于没有Host标题的健康检查以及仅使用IP地址等内容非常有用。

您必须稍微更改您的IP地址'172.17.*.*',使其成为172.17.0.0/16 <{3}} zip

答案 4 :(得分:2)

我已经找到了过滤IP范围的解决方案:

https://stackoverflow.com/a/36222755/3766751

使用这种方法,我们可以通过任何方式过滤IP(例如,使用正则表达式)。

from django.http import HttpResponseForbidden

class FilterHostMiddleware(object):

    def process_request(self, request):

        allowed_hosts = ['127.0.0.1', 'localhost']  # specify complete host names here
        host = request.META.get('HTTP_HOST')

        if host[len(host)-10:] == 'dyndns.org':  # if the host ends with dyndns.org then add to the allowed hosts
            allowed_hosts.append(host)
        elif host[:7] == '192.168':  # if the host starts with 192.168 then add to the allowed hosts
            allowed_hosts.append(host)

        if host not in allowed_hosts:
            raise HttpResponseForbidden

        return None

感谢@Zorgmorduk