适用于亚马逊ELB的Django ALLOWED_HOSTS

KVI*_*ISH 6 django amazon-web-services

我正在使用Django,我的ALLOWED_HOSTS设置包括我EC2的私有IP,如下所示:

import requests
EC2_PRIVATE_IP = None
try:
    EC2_PRIVATE_IP = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4', timeout=0.01).text
except requests.exceptions.RequestException:
    pass
if EC2_PRIVATE_IP and not DEBUG:
    ALLOWED_HOSTS.append(EC2_PRIVATE_IP)
Run Code Online (Sandbox Code Playgroud)

问题是上面没有考虑ELB将请求转发给我的EC2实例的问题.有没有办法以编程方式完成这项工作?我可以请求公共IP地址,还是设置检查DNS?

我在ELB的公共IP地址上看到了这个问题.

小智 9

另一个简单的解决方案是编写自定义 MIDDLEWARE,它会在ALLOWED_HOSTS检查之前向 ELB 提供响应。所以现在您不必ALLOWED_HOSTS动态加载。

中间件可以很简单:

project/app/middleware.py

from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin

class HealthCheckMiddleware(MiddlewareMixin):
    def process_request(self, request):
        if request.META["PATH_INFO"] == "/ping/":
            return HttpResponse("pong")
Run Code Online (Sandbox Code Playgroud)

settings.py

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'app.middleware.HealthCheckMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    ...
]
Run Code Online (Sandbox Code Playgroud)

Django 中间件参考https://docs.djangoproject.com/en/dev/topics/http/middleware/