在 django 中使用子域

Posted

技术标签:

【中文标题】在 django 中使用子域【英文标题】:Using subdomains in django 【发布时间】:2015-09-19 14:18:40 【问题描述】:

请告诉我是否可以(如果可以,如何)为每个用户子域的页面使用。例如,现在我有一个表单的 URL:http://hostname.com/user/1 我需要获取http://username.hostname.com/

【问题讨论】:

这更多地与您的服务器配置有关,而不是 python 或 django Django multi tenancy的可能重复 注:重复中的问题可能不同,但答案是一样的 你可以使用django-subdomains.readthedocs.org/en/latest/index.html 配置您的网络服务器以将所有子域请求定向到您的 django 应用程序(全部捕获)。然后对那里的请求做一些事情,比如: bits = urlparse.urlsplit(request.META['HTTP_HOST'])[0].split('.') bits[0] 来源:agiliq.com/blog/2008/10/using-subdomains-with-django 【参考方案1】:

考虑使用django-hosts

来自文档:

# For example, if you own example.com but want to serve 
# specific content at api.example.com and beta.example.com, 
# add the following to a hosts.py file:

from django_hosts import patterns, host

host_patterns = patterns('path.to',
    host(r'api', 'api.urls', name='api'),
    host(r'beta', 'beta.urls', name='beta'),
)

【讨论】:

【参考方案2】:

根据您想要深入的程度,您有多种选择。

    一种选择是在 Web 服务器级别处理路由。基本上,您将捕获 URL 的子域部分并将其重写到服务器中的不同位置。

    例如http://username1.local.host/signin 将被您的网络服务器捕获并在内部路由到诸如/username1/signin 之类的资源。最终用户将使用子域,但您的代码将处理 url 部分,而对于发生的事情并不明智。

    然后,您的 urls.py 将像处理任何正常请求一样处理此问题。

    url_pattern = [
       ...
       url(r'(?P<subdomain>[a-z]+)/sigin/$', 'view'),
    ]
    

    对于 nginx,您需要查看“子域到子目录的重写”。

    对于您在问题中所说的内容,我会亲自使用此选项。虽然这种方法最初设置起来有点棘手(保持它直到它工作)。从长远来看,它会更容易维护和使用。

    1234563 django代码))。 无需过多介绍,nginx 将捕获子域并将所有子域路由到 django。然后 Django 将在中间件级别处理子域。

我个人会使用选项 1 供您使用。选项 2 是如果您想要不同域上的不同应用程序,例如:blog.local.hostsupport.local.host

【讨论】:

只是一个小警告,选项一将要求您将子域作为参数输入到每个视图中,并可能导致未使用变量的 pep8 警告(这是副本试图避免的)。跨度> 只是另一个小警告:不支持选项 2,它们不会合并 github.com/tkaemming/django-subdomains/pull/67 Django Subdomains 似乎已被废弃,但有一个积极开发的 fork:abe312/django-subdomains,使用 pip install subdomains 安装它。

以上是关于在 django 中使用子域的主要内容,如果未能解决你的问题,请参考以下文章

在多个子域上共享 Django 会话的缺点

将子域指向 Django 中的特定 url

如何在同一子域上获取不同的 Django 应用程序以共享会话 cookie?

通过子域在同一 Droplet 中的两个或多个 Django 项目

Apache2 使用 Django 项目设置带有子域的虚拟主机

python Django子域中间件