【发布时间】:2011-08-23 16:40:07
【问题描述】:
我创建了一个 Django 项目来管理共享一些后端代码的两个独立站点。这两个网站都在不同的应用程序中。每个应用都有自己的 models.py、views.py、模板等...
为了能够对不同的主机名做出不同的反应,我创建了一个 URLconf 中间件:
class HostnameBasedUrlconfMiddleware(object):
"""This middleware parses the hostname from the request, and selects the
urlconf accordingly.
To set a custom urlconf according to the current hostname, add an URLCONF
dictionary to your settings.py file.
URLCONF = {
'example.com': 'urls_example',
'example.dev': 'urls_dev',
'admin.example.dev': 'apps.admin.urls'
}
If the hostname is not found in the URLCONF dictionary, the default
ROOT_URLCONF setting will be used.
"""
def process_request(self, request):
# Decide which urlconf to use. Fallback is to use the ROOT_URLCONF
# as defined in the settings.py file.
try:
hostname = request.META['HTTP_HOST']
request.urlconf = settings.URLCONF[hostname]
except (KeyError, AttributeError):
pass
return None
起初这似乎可行,但后来我意识到必须进行某种缓存。
当启动服务器并请求站点 A 时,它会显示出来。如果我随后请求站点 B,则会出现站点 A。有时(但不总是),经过几次重新加载后,站点 B 最终会出现。重新启动服务器并请求站点 B 后,它会显示出来,但现在站点 A 会显示站点 B 的内容。
这发生在内置开发服务器和 gunicorn 中。
我尝试用 curl 请求站点以避免浏览器缓存,没有区别。
我还怀疑这可能是某种模板名称冲突,但所有模板都位于各自模板文件夹内的一个唯一命名的子文件夹中。
我没有安装 memcached,也没有使用任何缓存中间件。
可能是什么问题?是否正在进行一些内部自动缓存?
【问题讨论】:
-
您如何为您的单独主机名提供服务?
-
目前通过主机文件。一旦投入生产,它将立即切换到普通 DNS。两个域都应该通过同一个 Django 实例提供服务。
-
我遇到了同样的问题,这让我抓狂。我很欣赏乔丹的回应,但它没有回答你的问题。如果我能回答你的问题,那会让我的生活轻松很多。 :)
-
我将在这个问题上创建一个赏金,看看是否有人可以给出更好的答案。
-
就在我为赏金写出信息时,我回到我的系统中重新复制了几次以包含更多细节,但现在我无法在我的一生中复制它。我现在完全糊涂了……如果它再次发生,我会回来的。
标签: django caching middleware