Django Tenants+DRF环境下域名解析失败问题求助
问题分析与解决方案
一、域名解析失败的原因及修复
- 浏览器自动处理
.localhost域名:现代主流浏览器(Chrome、Firefox等)默认会将所有.localhost后缀的域名直接映射到127.0.0.1,无需额外系统配置。 - 系统DNS无对应解析记录:控制台工具(ping、requests、HTTPie)依赖系统DNS服务解析域名,而系统默认没有
demo.localhost的解析条目,因此抛出getaddrinfo failed错误。
修复步骤:
- 打开系统hosts文件:
- Windows:
C:\Windows\System32\drivers\etc\hosts - Linux/macOS:
/etc/hosts
- Windows:
- 添加解析记录:
127.0.0.1 demo.localhost - 保存文件(Windows需管理员权限),之后控制台工具即可正常解析该域名。
二、django-tenants中向各租户发送API请求的方法
方法1:hosts文件映射多租户域名(开发环境用)
若租户数量较少,可在hosts文件中添加所有租户的域名记录:
127.0.0.1 demo.localhost 127.0.0.1 tenant2.localhost 127.0.0.1 tenant3.localhost
之后直接通过对应域名发送请求:
import requests response = requests.get("http://tenant2.localhost:9000/api/zakaz")
方法2:反向代理配置(生产环境推荐)
用Nginx等反向代理服务器配置通配符子域名转发,示例Nginx配置:
server { listen 80; server_name *.localhost; location / { proxy_pass http://127.0.0.1:9000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
所有*.localhost子域名都会被转发到Django服务,django-tenants可自动识别对应租户。
方法3:内部上下文请求(无需网络)
如果是Django内部服务间调用,可直接切换租户上下文后使用Django测试客户端,避免网络开销:
from django.test import Client from django_tenants.utils import get_tenant_model Tenant = get_tenant_model() target_tenant = Tenant.objects.get(domain_url="demo.localhost") # 切换到目标租户的Schema上下文 with target_tenant.schema_context(): client = Client() response = client.get("/api/zakaz") # 处理响应数据 print(response.json())
补充说明
你的TENANT_APPS配置无明显问题,确保rest_framework在租户应用列表中,可保证每个租户的API配置独立生效。
内容的提问来源于stack exchange,提问作者Евгений
相关产品推荐
相关产品推荐

