我可以在Django中为每个用户创建子域

时间:2011-07-01 02:56:45

标签: django django-templates django-views

我希望用户创建自己的帐户,用户应该获得自己喜欢的user.foo.com,并指向不同的模板文件夹。是否有可能在Django。我是Django的新手

3 个答案:

答案 0 :(得分:12)

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

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

这基本上都是完全错误的。事实上,所有你需要解决的问题是:Subdomain Middleware。只需将其与适当的网络服务器配置相结合即可接受对* .example.com的请求,并且您拥有必要的变量以在每个视图中关闭您的队列

答案 1 :(得分:5)

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

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

此外,DNS注册是一个主要问题。如果你有一个通配符域名,例如"*.foo.com",你会没事的。如果您的DNS提供商不允许这样做,您需要让某人手动注册额外的子域。

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

答案 2 :(得分:0)

您所指的是 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

然后为保存客户端/租户表的应用程序执行迁移。

然后:-

python manage.py migrate_schemas --shared

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