【问题标题】:Set up subdomains for tenants in a Django web app?在 Django Web 应用程序中为租户设置子域?
【发布时间】:2019-12-24 04:37:03
【问题描述】:

我已经为我正在尝试构建的多租户 SaaS 应用程序安装了 django-tenant-schemas。到目前为止,我已经设法在 postgres 中创建模式,因此每个租户都有独立的表。

如果用户访问我的网站,例如 www.mydomain.com,并通过提供用户名、密码和公司(例如“Joeys Company”)进行注册 - 我将如何为该用户动态创建一个新的子域,在此案例 joeyscompany.mydomain.com?

人们提到了通配符域,但不确定如何实际设置它

【问题讨论】:

    标签: python django


    【解决方案1】:

    您的问题可以分解为两个较小的子问题。

    1. 如何为租户指定域名?

    As described in the docs,当您创建租户时,您使用domain_url 参数将域名与租户相关联。因此,如果您使用domain_url='tenant.mysite.com' 创建一个租户,并且使用主机名tenant.mysite.com 向您的服务器发送请求,django-tenant-schemas 将自动为该租户使用正确的数据库模式。这就引出了第二个问题:

    1. 如何使用 DNS 将该子域指向您的应用程序?

    您说得对,最简单的方法是设置通配符子域。无需深入了解 DNS 课程,您将拥有一个类似于 *.mysite.com 的 DNS 条目,其中 * 表示“任何东西”。此通配符子域将指向运行应用程序的服务器的 IP 地址。因此,anything.mysite.com 将解析到您的服务器。

    设置通配符子域的过程会因您的 DNS 提供商而异。您应该查阅他们的文档以了解详细信息。

    【讨论】:

    • > ... create a tenant you use the domain_url parameter to associate a domain name with a tenant... use the tenant with domain_url='tenant.mysite.com.' 这就是我现在手动操作的方式 - 但是,如何让用户在网站上注册时动态创建自己的域名? >The process of setting up a wildcard subdomain will be different depending on your DNS provider. You should consult their documentation for specifics.我还没有部署任何东西,我现在都在本地做
    • 至于让用户选择自己的子域,如果您想要该功能,可以在注册表单中执行此操作。关于本地测试,您可以使用笔记本电脑上的 hosts 文件将域名指向您的笔记本电脑。
    • 那么,这个问题仍然没有答案 - 这是如何完成的..
    • 关于问题 1,您需要分享您当前的代码(模型、表单、视图等),以便我们进一步提供帮助。关于问题 2,如果您让我们知道您的 DNS 是在哪里管理的,我们可以尝试并引导您找到相应的文档。
    • 我想出了如何动态创建子域,但我现在面临另一个问题,即让用户登录 - 我为它创建了一个新问题 - 在这里找到:stackoverflow.com/questions/59436447/…跨度>
    【解决方案2】:

    我真的想通了。对于任何感兴趣的人,这里是在用户注册时自动创建租户的代码。

    class SignupView(View):
        def get(self, request):
            form = RegistrationForm()
            return render(request, "accounts/signup.html", {"form": form})
    
        def post(self, request, *args, **kwargs):
            form = RegistrationForm(request.POST)
            if form.is_valid():
                instance = form.save(commit=False)
                tenant = Client(domain_url=company + ".my-domain.com", schema_name=company, name=company)
                tenant.save()
    
                with schema_context(tenant.schema_name):
                    instance.save()
                    redirect = 'http://' + company + '.my-domain.com:8000/accounts/login'
                    return HttpResponseRedirect(redirect)
            return render(request, "accounts/signup.html", {"form": form})
    
    

    【讨论】:

      猜你喜欢
      • 2017-05-26
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多