时间:2011-01-06 19:56:45

标签: django sites

我有两个密切相关的网站,一个主网站和一个移动网站,作为django应用程序托管。它们具有许多相同的功能,需要访问相同的数据。主要区别在于模板会有所不同,网站的结构方式会有所不同。

我有两个独立的虚拟主机,每个主机一个(虽然我没有这样做)。我的第一个想法是Django站点框架有助于解决这个问题,但文档似乎并没有描述我的用例。

有人能给我一个暗示,知道我是否走在正确的轨道上? urls.py需要有所不同,因为例如,主页在应用之间完全不同。主要目标是共享两个不同应用程序中的数据,并且不需要复制要管理的代码。

来自主要网站:

  • 用户提交存储在模型中的项目

来自移动网站:

  • 用户查看项目列表并查看刚在主站点上输入的项目
  • 用户对最近添加的项目
给出5星评级

来自主要网站:

  • 用户查看评分较高的项目列表,最近添加的项目(现在评分较高)显示在列表中。

3 个答案:

答案 0 :(得分:4)

看看this answer to a similar question。基本上,您可以使用相同的视图,只需根据用户代理返回不同的模板。 此外,如果您构建应用程序逻辑以便将其分解为django术语中的不同“应用程序”,那么如果您需要具有类似组件的不同流程,则可以重新使用它们。 希望这可以帮助你摆脱困境。

更新:

因此,假设您的主网站http://www.mainsite.com/拥有自己的urls.py models.py和views.py,可以为主网站提供功能。然后你有http://www.m.mainsite.com/,它有自己的网址和视图。然后,您可以导入主站点的模型,并在移动站点视图中使用它们。

答案 1 :(得分:1)

好的,这两个答案都很棒,并为我最终解决方案的选择做出了贡献。

在settings.py文件中有一个名为ROOT_URLCONF的选项。我创建了两个settings.py文件,名为settings_desktop.py和settings_mobile.py,并且在每个文件中都使用了以下代码:

from settings.py import *

ROOT_URLCONF = 'myapp.urls_mobile'

(或在桌面的情况下,myapp.urls_desktop)

这实际上提供了许多很酷的功能,例如能够为每个站点使用不同的模板目录,但实际上我不打算这样做。

然后我创建了两个版本的wsgi文件,其中唯一的区别是这一行:

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings_mobile'

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings_desktop'

在每个虚拟主机中,唯一的区别是WSGIScriptAlias行指向每个主机的不同wsgi文件。

这使我能够有效地使用一个可以轻松容纳这两个网站的django应用程序。

感谢您帮助找到一个好的解决方案。

答案 2 :(得分:0)

我做过一次非常相似的事情。我解决多个urls.py问题的方法是这样的:

创建两个urlconf,每个站点一个;

创建一个新的中间件:

from django.utils.cache import patch_vary_headers

class DomainMiddleware:

    def __init__(self):
        pass

    def process_request(self, request):

        #avoid problems when reaching the server directly trough IP
        host = request.META.get('HTTP_HOST', None)
        if host is None: return

        host = host.split(':')[0] #remove port number

        if host is mobile:
            urlconf = "mobile.urls"
        else:
            urlconf = "default.urls"

        request.urlconf = urlconf

    def process_response(self, request, response):
        patch_vary_headers(response, ('Host',))
        return response

检查为什么必须执行patch_vary_headers on the docs