【问题标题】:In a django web application, how do you give users their own subdomain?在 django web 应用程序中,如何给用户自己的子域?
【发布时间】:2010-10-12 02:37:06
【问题描述】:

我正在使用 Django 和 Pinax 开始一个新的 Web 应用程序项目。我希望能够像 Wordpress 和其他网站一样为我的用户提供独特的域名:username.wordpress.com。我不确定如何使用 Django 来解决这个问题,因为 url 解析逻辑(在 urls.py 中)以域名之后的 url 开头。

更具体地说,会有多个用户组,每个组都有一个唯一的名称。不确定这有什么不同,但我想我应该提一下。

有没有什么方法可以操纵 http 请求,使 URL 在 Django 中看起来像是 www.domain.com/groupname,但在浏览器地址栏中仍显示为 groupname.domain.com

【问题讨论】:

标签: django subdomain pinax


【解决方案1】:

您需要通过您的网络服务器处理此问题。如果您有 Django 网址,例如...

/users/<username>/

...然后使用网络服务器中的重写规则将&lt;username&gt;.domain.com 映射到domain.com/users/&lt;username&gt;/

如果您使用的是 Apache,您可以阅读 here。否则,每个网络服务器都有自己的约定,但都支持 url 重写的概念。

【讨论】:

  • 这听起来像是可行的,甚至还有一个与我想要的非常相似的示例“虚拟主机”。但我绝不像 Apache 管理员,并且害怕将“应用程序逻辑”放入 Web 服务器配置中。此外,我必须在 Apache 而不是 Django 开发服务器上进行开发。
  • 您仍然可以在开发服务器上进行开发...只是不要在模板中指向绝对 URL。我也讨厌使用 Apache conf 文件,但这是一项复制和粘贴工作。
  • 我很好奇。在您看来,您认为这比使用中间件更好吗?我觉得它更干净了。
  • 对我来说效果很好。主要问题是,如果您使用 {% url ... %} 模板标签,您将需要一个省略 URL 前缀部分的自定义版本。
【解决方案2】:

您可以使用一些自定义中间件来拦截请求并从中获取子域。以下代码将检索子域并重定向到reversing the named url 的视图。

把它放在你应用中的一个 middleware.py 文件中。

确保您在 settings.py 文件中设置了中间件。

确保你已经在 urls.py 中命名了你的视图

middleware.py

from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
import re

subdomain_pattern = re.compile('(?P<subdomain>.*?)\..*?')

class SubdomainMiddleware(object):
    def process_request(self, request):
        match = subdomain_pattern.match(request.get_host())
        subdomain = match.group('subdomain')
        redirect_url = reverse('groups_detail', args=[subdomain])
        return HttpResponseRedirect(redirect_url)

urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    url(r'^groups/(?P<name>.+)/$', 'groups.views.detail', {}, name='group_detail'),
)

注意:此代码未经测试。

重定向可以改变 URL 的外观。如果您想避免这种情况,只需调用关联的视图,捕获其结果,然后在 HttpResponse() 中返回它。

【讨论】:

  • +1:中间件是最好的方法,恕我直言。在 webserver/dns 端,检查通配符子域。
  • 这听起来不错。不完全确定如何更改请求的路径 - HttpRequest.build_absolute_uri(location) 实际上会更改路径,还是只返回一个字符串?我可以直接更改“路径”属性,但文档说“除session 之外的所有属性都应视为只读。
  • 查找子域只是其中的一部分。如果这可行,这听起来像是我没听说过的一个很好的解决方案,但是您能否使用代码更新帖子以更改请求 url,使其反映“真实”的 Django url?谢谢(我有一个重写的网站,我更喜欢这种可能性)。
  • 我大大修改了我的代码来进行响应重定向。它未经测试,但应该给你一个很好的起点。
  • 另外,reverse() 也不是完全必要的,您可以在响应本身中对 url 进行硬编码。但是反向 urls 意味着 url 模式可以改变,中间件仍然可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
相关资源
最近更新 更多