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

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

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

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

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

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

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

最佳答案 你看过django.contrib.sites吗?我认为结合这一点,在settings.py中设置SITE_ID,并为每个“站点”设置一个WSGI文件可以解决问题.

编辑:-v设置.

django.contrib.sites旨在让您从同一个Django项目和数据库中运行多个站点.它添加了一个具有域和名称字段的表(django.contrib.sites.models.Site).据我所知,这个名字可能意味着你想要的任何东西,但它通常是网站的英文名称.域应该显示在URL的主机部分中.

在settings.py中将SITE_ID设置为正在提供的站点的ID.在初始settings.py文件中,它设置为1(没有注释).您可以使用您需要的任何代码将其替换为正确的值.

显而易见的事情是检查环境变量,并在Site表的名称或域字段中查找它,但我不确定它是否可以在settings.py文件中工作,因为该文件设置数据库连接参数(循环依赖?).所以你可能不得不满足于:

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

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

os.environ['SITE_ID'] = 2

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

站点框架是最强大的,您可以将Site用作ForeignKey或ManyToManyField的目标,以便您可以将模型实例(即记录)链接到特定站点.

点赞