将具有子域的应用程序迁移到单个 URL

问题描述 投票:0回答:1

我目前有一个使用 django-tenants 的应用程序,每个租户都有子域(tenant1.domain.com、tenant2.domain.com...) 它使用个人身份验证,身份验证模型位于架构中 所以我的问题是: 是否可以迁移到单个 URL 模型以进行身份验证和导航?

我尝试了很多解决方案,其中一些解决方案能够对我的用户进行身份验证,但没有一个能够让我使用“无架构”URL 在租户中导航 简而言之,没有人维护/创建会话

python django middleware django-tenants django.contrib.auth
1个回答
0
投票

您可以使用 NGINX 配置部分解决此问题,特别是管理子域到 URL 的路由和处理。但是,身份验证、会话管理和数据库架构更改等某些方面仍然需要在 Django 应用程序中处理。

  1. 域名到 URL 映射:

在 NGINX 配置中,您可以为主域(例如,domain.com)设置一个服务器块,并使用通配符服务器名称来捕获所有子域。在此服务器块内,您可以配置 NGINX 以根据子域重写 URL。例如:

server {
    listen 80;
    server_name ~^(?<subdomain>.+)\.domain\.com$;
    location / {
        proxy_set_header Host domain.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://backend-server/$subdomain$request_uri;
    }
}

在上面的示例中,NGINX 使用正则表达式捕获子域,然后将其作为重写 URL 的一部分传递到后端服务器。

  1. 后端配置:

在 Django 应用程序中,您需要修改 URL 路由以根据捕获的子域处理 URL。这意味着您的视图和模型应该根据 URL 了解租户。

  1. 会话和身份验证:

虽然 NGINX 可以处理 URL 路由,但处理身份验证和会话管理通常是 Django 应用程序的责任。您将需要更新 Django 身份验证逻辑以使用基于 URL 的租户识别。

  1. 数据库架构:

如前所述,您可能需要调整数据库架构以处理具有tenant_id 字段的共享数据库。这主要是 Django 应用程序代码更改,不是 NGINX 可以直接处理的事情。

总而言之,NGINX 可以通过将子域转换为 URL 来帮助完成 URL 路由部分,但它不处理身份验证、会话管理或数据库架构更改。这些方面需要修改 Django 应用程序代码。此外,彻底的测试和可能的逐步部署对于确保平稳过渡至关重要。

© www.soinside.com 2019 - 2024. All rights reserved.