我有一个django项目,其中有几个不同的应用程序,应该托管在不同的域上。例如,我们称之为:
管理站点,ourdashboard.com网站你知道吗
第一个内容网站oursite1.com
第二个内容网站oursite2.com
仪表板网站仅面向内容发布者,而内容网站则面向访问者。每个网站在功能、内容和设计方面都是不同的。我希望出版商能够在这两个网站上发布内容,所以我不习惯创建不同的django项目。但内容的类型需要针对特定受众的不同网站。你知道吗
我启动了一个叫dashboard的应用程序。我想把这个应用程序托管在ourdashboard.com网站域,访问此域将直接访问dashboard.urls
。所以基本上我想用一个django项目托管多个站点,每个域都链接到一个特定的appurl文件。你知道吗
我做了一点研究,偶然发现了MultiHostMiddleware,并试图实现它。看起来很简单,但是以前从未使用过djangos中间件,我一开始就遇到了麻烦。我按照说明正确地实现了代码,但是我不断地得到500个内部服务器错误。起初我以为我把设置文件搞砸了,但看不出问题出在哪里。然后我查看了日志,发现中间件类没有收到get_response
。对Middleware Documentation的更多研究表明,初始化和可调用函数是必需的,__init__
只能接收单个参数“get\u response”。此外,我还了解到djangos中间件在不久前有一些大的变化,而MultiHostMiddleware的最后一次更新是在3年前(目前我使用的是Django 2.1.5,所以在中间件发生变化之后)。我已经盯着旧代码看了6个小时了,正在寻找可能的解决方案,但老实说,当涉及到中间件时,我甚至不知道从哪里开始。我甚至认为我可以将现有的函数应用于所需的函数,认为进程响应是可调用的,因为它返回响应,但我掉进了另一个兔子洞。所以,我正在寻找一种方法来调整django2.1的旧代码,以便使用同一个django项目托管不同的站点。你知道吗
设置.py
MIDDLEWARE = [
'network.middleware.MultiHostMiddleware',
...
]
HOST_MIDDLEWARE_URLCONF_MAP = {
"ourdahsboard.com": "dashboard.urls",
"oursite1.com": "musiclounge.urls",
"oursite2.com": "artworld.urls",
}
中间件.py
import time
from django.conf import settings
from django.utils.cache import patch_vary_headers
class MultiHostMiddleware:
def process_request(self, request):
try:
request.META["LoadingStart"] = time.time()
host = request.META["HTTP_HOST"]
#if host[-3:] == ":80":
# host = host[:-3] # ignore default port number, if present
# best way to do this.
host_port = host.split(':')
if len(host_port)==2:
host = host_port[0]
if host in settings.HOST_MIDDLEWARE_URLCONF_MAP:
request.urlconf = settings.HOST_MIDDLEWARE_URLCONF_MAP[host]
request.META["MultiHost"] = str(request.urlconf)
else:
request.META["MultiHost"] = str(settings.ROOT_URLCONF)
except KeyError:
pass # use default urlconf (settings.ROOT_URLCONF)
def process_response(self, request, response):
if 'MultiHost' in request.META:
response['MultiHost'] = request.META.get("MultiHost")
if 'LoadingStart' in request.META:
_loading_time = time.time() - int(request.META["LoadingStart"])
response['LoadingTime'] = "%.2fs" % ( _loading_time, )
if getattr(request, "urlconf", None):
patch_vary_headers(response, ('Host',))
return response
**更新**
As, requestedstack error:
Traceback (most recent call last):
File "/home/user/webapps/django_network/network/network/wsgi.py", line 16, in <module>
application = get_wsgi_application()
File "/home/user/webapps/django_network/lib/python3.7/Django-2.1.5-py3.7.egg/django/core/wsgi.py", line 13, in get_wsgi_application
return WSGIHandler()
File "/home/user/webapps/django_network/lib/python3.7/Django-2.1.5-py3.7.egg/django/core/handlers/wsgi.py", line 136, in __init__
self.load_middleware()
File "/home/user/webapps/django_network/lib/python3.7/Django-2.1.5-py3.7.egg/django/core/handlers/base.py", line 36, in load_middleware
mw_instance = middleware(handler)
TypeError: __init__() missing 1 required positional argument: 'get_response'
我认为您正在编写旧式MIDDLEWARE(在django 1.10之前就已经存在),您需要这样更新它:
仅供参考,这是一个未经测试的代码,但它将防止您目前面临的错误。你知道吗
更新
您可以按照这个documentation将旧式django中间件更新为新的样式。我想你可以这样试试:
相关问题 更多 >
编程相关推荐