Django-tenant报错:'No tenant for hostname'及租户创建异常求助
错误排查方案
一、解决「Can't create tenant outside the public schema」错误
- 检查
TenantMiddleware配置,把创建租户的URL排除在中间件处理外。django-tenants的中间件会自动切换请求到对应租户的schema,但创建租户必须在publicschema下操作。可以在中间件配置里加EXCLUDE_URLS,或者在视图里手动切换到public schema再创建租户,修正代码示例:from django_tenants.utils import schema_context def post(self, request): form = CreatePortalForm(request.POST) if form.is_valid(): getDomain = form.cleaned_data.get('name') instance = form.save(commit=False) user = User.objects.get(id=request.user.id) # 强制在public schema下创建租户和域名 with schema_context('public'): tenant = Client(schema_name=getDomain, name=getDomain, created_by=user) tenant.save() domain = Domain.objects.create( domain=f"{getDomain}.example.com", tenant=tenant, is_primary=True ) with schema_context(tenant.schema_name): instance.save() return HttpResponseRedirect(f'http://{getDomain}.example.com:8000') return render(request, "registraton/create_portal.html", {"form": form}) - 确认项目启动时数据库默认schema是
public,如果默认schema被修改,也会导致创建租户失败。
二、解决「No tenant for hostname」错误
- 去掉域名里的端口:数据库
Domain表的domain字段别存端口(比如8000),django-tenants匹配租户时会忽略请求端口,只认域名部分。你现在存的是tenant1.example.com:8000,但请求的Host头是tenant1.example.com,自然匹配不上。 - 配置本地hosts:本地测试时,得把
tenant1.example.com这类域名映射到127.0.0.1,否则浏览器解析不了,请求到不了本地服务,中间件找不到租户。 - 核对数据库记录:检查
Domain表的domain字段拼写是否正确,是否和租户正确关联,is_primary是否设为True。 - 验证Host头匹配:可以在
TenantMiddleware里打印request.get_host()的值,对比数据库里的域名记录,确认两者一致。
额外验证
- 直接在数据库的
publicschema里查看client和domain表,确认租户的schema_name和域名对应无误。 - 在Django shell里执行
from django_tenants.utils import get_tenant_domain_model; get_tenant_domain_model().objects.get(domain='tenant1.example.com'),看能不能查到对应租户,排查数据是否正确。
内容的提问来源于stack exchange,提问作者ckcAdmin
相关产品推荐
相关产品推荐

