【问题标题】:Can I create sub domain for each user in Django我可以为 Django 中的每个用户创建子域吗
【发布时间】:2011-09-26 10:54:07
【问题描述】:

我希望用户创建自己的帐户,并且用户应该拥有自己的帐户,如 user.foo.com 和不同的指向不同的模板文件夹。在 Django 中是否可能。我对 Django 很陌生

【问题讨论】:

    标签: django django-templates django-views


    【解决方案1】:

    Andre 提供的答案并不完全正确。您确实需要一个通配符域,大多数体面的提供商都会允许这样做,包括 GoDaddy(IE 这不是您应该非常关注的限制)。

    “要直接执行此操作,您需要在对您的网络服务器配置文件具有写入权限的用户帐户下运行 Django,这真的不推荐。假设所有主机都在同一台机器上,您可以这样做间接地,例如排队请求并让某人手动批准它们并编辑文件,或者让脚本通过 cron 运行并每隔 X 分钟/小时/天重写一次服务器配置。”

    这基本上在各个方面都是完全错误的。事实上,你只需要这样做:Subdomain Middleware。只需将其与适当的网络服务器配置相结合以接受对 *.example.com 的请求,您就有必要的变量在每个视图中取消您的队列

    【讨论】:

    • 除非有明显的限制。使用此解决方案,所有用户将共享同一数据库中的数据,在同一用户帐户下运行,所有用户拥有相同的应用程序(因此相同的设置)。最后一个基本上意味着您不能拥有不与用户帐户绑定的其他子域,例如www.foo.com
    • 仍然为您的答案 +1,因为它是另一种解决方案。
    • 自 2011 年以来这个问题是否有更新/更好的答案?
    • 这是真正的答案,不是上面那个。
    【解决方案2】:

    Django 本身不知道您使用的是什么网络服务器。通常,要配置额外的子域,您需要将虚拟主机添加到您的网络服务器的配置中,并确保您的 DNS 提供商将该子域的请求转发到相应的服务器。

    要直接执行此操作,您需要在对您的网络服务器配置文件具有写入权限的用户帐户下运行 Django,这真的不推荐。假设所有主机都在同一台机器上,您可以间接执行此操作,例如排队请求并让某人手动批准它们并编辑文件,或者让脚本通过cron 运行并每 X 分钟重写一次服务器配置/小时/天。

    此外,DNS 注册也是一个主要问题。如果您有诸如"*.foo.com" 之类的通配符域名,那就没问题了。如果您的 DNS 提供商不允许这样做,您需要有人手动注册额外的子域。

    基本上,这几乎与 Django 无关,而且几乎所有这些都取决于您服务器的软件堆栈(您尚未指定)。

    【讨论】:

      【解决方案3】:

      您所指的是 Django 租户架构,如果这不是您的限制,那么它使用 Postgresql 做得很好。有 3 种可用配置:-

      1. 一个数据库供所有人使用。
      2. 单一数据库,所有不同的架构表
      3. 为每个客户或租户提供不同的数据库。

      现在,我将继续使用第二种方法。

      它的作用是创建不同的数据库模式。

      安装 Postgresql 和必要的数据库连接器和驱动程序后,更改数据库中的设置,然后安装此应用程序:https://django-tenant-schemas.readthedocs.io/en/latest/index.html -

      pip install django-tenant-schemas
      

      添加:-

      DATABASES = {
      'default': {
          'ENGINE': 'tenant_schemas.postgresql_backend',
          # ..
      }
      

      }

      然后继续添加这一行。

      DATABASE_ROUTERS = (
      'tenant_schemas.routers.TenantSyncRouter',
      

      )

      这将安装租户架构。

      也就是说它赋予了Django区分租户的认知。

      之后将中间件类添加到中间件堆栈的顶部可确保租户拥有第一个过滤器。

      MIDDLEWARE_CLASSES = (
      'tenant_schemas.middleware.TenantMiddleware',
      #...
      

      )

      配置完成后,定义租户模型,即保存不同子域和用户信息的表,以便隔离每个用户的数据。

      然后定义公共/共享应用程序,所有用户都将拥有相同的访问权限,然后定义租户特定应用程序,这些应用程序将只保存他们的数据,即他们的租户特定数据。

      SHARED_APPS = (
      'tenant_schemas',  # mandatory, should always be before any django app
      'customers', # you must list the app where your tenant model resides in
      
      'django.contrib.contenttypes',
      
      # everything below here is optional
      'django.contrib.auth',
      'django.contrib.sessions',
      'django.contrib.sites',
      'django.contrib.messages',
      'django.contrib.admin',
      

      )

      TENANT_APPS = ( 'django.contrib.contenttypes',

      # your tenant-specific apps
      'myapp.hotels',
      'myapp.houses',
      

      )

      INSTALLED_APPS = ( 'tenant_schemas', # 强制,应该总是在任何 django 应用之前

      'customers',
      'django.contrib.contenttypes',
      'django.contrib.auth',
      'django.contrib.sessions',
      'django.contrib.sites',
      'django.contrib.messages',
      'django.contrib.admin',
      'myapp.hotels',
      'myapp.houses',
      

      )

      设置你的租户模型

      例如:-

      TENANT_MODEL = "customers.Client" # app.Model

      然后为持有 Client/Tenant 表的应用程序执行 makemigrations。

      然后:-

      python manage.py migrate_schemas --shared
      

      这将创建架构并将您设置为允许每个租户使用不同的租户和不同的数据库,默认情况下,这些数据库将按您在客户端/租户应用程序中设置的域的子域进行隔离。

      【讨论】:

        猜你喜欢
        • 2010-12-20
        • 1970-01-01
        • 2021-03-22
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        相关资源
        最近更新 更多