如何让Django url调度程序使用子域名?

时间:2010-06-29 22:09:20

标签: django .htaccess mod-rewrite

我对如何解决这个问题有一个模糊的想法,但确实需要推动:)

我有一个运行apache的Django应用程序(mod_wsgi)。今天网址看起来像这样: http://site.com/category/A/product/B/

我想做的是: http://A.site.com/product/B

这意味着url调度程序需要如何获取子域中找到的值并了解其上下文而不是仅查看路径。我看到两种方法:

  • 使用.htaccess并重写,以便a.site.com是重写。不确定这是否有效,因为我不完全理解django url调度程序框架在这种情况下会看到什么?
  • 了解网址调度程序的工作方式我可以编写一个查看有效子网域的过滤器,并以重写的格式将其提供给网址调度程序代码。

非常感谢任何提示或解决方案! 感谢。

3 个答案:

答案 0 :(得分:1)

你看过django.contrib.sites了吗?我认为,在SITE_ID中设置settings.py,并在每个“网站”中设置一个WSGI文件可以解决问题。

编辑: -v设置。

django.contrib.sites旨在让您从同一个Django项目和数据库中运行多个站点。它添加了一个包含django.contrib.sites.models.Sitedomain字段的表格name)。据我所知,name可以表示你想要的任何东西,但它通常是网站的英文名称。 domain应该显示在网址的主机部分中。

SITE_IDsettings.py中设置为所投放网站的id。在最初的settings.py文件中,它设置为1(没有注释)。您可以使用您需要的任何代码将其替换为正确的值。

显而易见的事情是检查一个环境变量,然后在name表的domainSite字段中查找,但我不确定将在settings.py文件中工作,因为该文件设置数据库连接参数(循环依赖?)。所以你可能不得不满足于:

SITE_ID = int(os.environ.get('SITE_ID', 1)

然后在您的WSGI文件中,您执行以下操作:

os.environ['SITE_ID'] = 2

并将最后一个数字设置为适当的值。每个站点需要一个WSGI文件,或者可能有一种方法可以在Apache安装程序中设置SITE_ID。选择哪条路径取决于相关的网站设置。

使用Site作为ForeignKeyManyToManyField的目标时,网站框架最为强大,因此您可以将模型实例(即记录)链接到特定网站。 / p>

答案 1 :(得分:1)

如果您希望在多个域或子域上拥有多个具有不同内容(站点模块)的相同应用的站点,那么Mikes解决方案是正确的,但它有一个缺点,您需要运行Django进程的多个实例。

针对多个域或子域的主要问题的更好解决方案是使用简单的中间件来处理具有process_request()函数的传入请求并更改记录的urlconf属性(link)您要使用的URLconf的请求对象。

更多详细信息和per-request or per-domain URL dispatcher的示例可在以下位置找到: http://gw.tnode.com/0483-Django/

答案 2 :(得分:0)

尝试添加通配符子域:通常为*