我有两个密切相关的网站,一个主网站和一个移动网站,作为django应用程序托管。它们具有许多相同的功能,需要访问相同的数据。主要区别在于模板会有所不同,网站的结构方式会有所不同。
我有两个独立的虚拟主机,每个主机一个(虽然我没有这样做)。我的第一个想法是Django站点框架有助于解决这个问题,但文档似乎并没有描述我的用例。
有人能给我一个暗示,知道我是否走在正确的轨道上? urls.py需要有所不同,因为例如,主页在应用之间完全不同。主要目标是共享两个不同应用程序中的数据,并且不需要复制要管理的代码。
来自主要网站:
来自移动网站:
来自主要网站:
答案 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。