根据域名的一部分动态选择Django数据库

1 投票
1 回答
515 浏览
提问于 2025-04-18 15:53

我正在创建一个Django项目,希望这个项目能对许多小公司有帮助。我希望他们能在我的公共页面上点击一个“创建演示”按钮,这样就能为Django项目创建一个空数据库。

所以,我希望能访问 http://example.com/demo_ahttp://example.com/demo_b,但在Apache的配置文件里只需要一条记录。

<VirtualHost *:80>
    ServerName example.com
    WSGIScriptAlias / /var/www/example/mysite.wsgi

    <Directory var/www/example>
            Order allow,deny
            Allow from all
    </Directory>
</VirtualHost>

我不想每次想创建一个演示网站时都要去修改http.conf文件。所以,如果他们需要访问 http://example.com/demo_a(比如说)我也是可以接受的。

我不太明白的是,如何把“demo_a”关联到一个数据库。虽然有数据库路由和网站相关的东西,但我不知道怎么根据URL的一部分(比如“demo_a”)来选择一个数据库(或“网站”)。

另外,我把静态文件存储在S3里,目录是动态决定的,所以静态文件我想我能处理。

这整个事情也可能对负载均衡有帮助。

我对Django的这个层面还是比较陌生。有没有什么想法?感觉这个应该能实现,但不太确定怎么去做。

1 个回答

2

你遇到的问题并不新鲜,这是任何开发多租户软件或者软件即服务应用时都会碰到的常见问题。

如果想更深入了解这种架构带来的数据挑战,我强烈推荐你阅读这篇2006年MSDN的优秀文章

django-tenant-schemas应用提供了一种视图路由功能,可以确保不同的域名正确地指向各自的数据库:

每个租户通过他们的主机名来识别(比如 tenant.domain.com)。这些信息会存储在公共架构的一个表里。每当有请求发出时,系统会用主机名在数据库中查找对应的租户。如果找到了匹配的租户,搜索路径就会更新为使用这个租户的架构。从此以后,所有的查询都会在这个租户的架构中进行。例如,假设你有一个租户客户在http://customer.example.com。任何发往customer.example.com的请求都会自动使用这个客户的架构,并使得该租户在请求中可用。如果没有找到租户,就会出现404错误。这也意味着你应该为你的主域名设置一个租户,通常使用公共架构。

撰写回答