不幸的是,我无法解决您的主要问题(缓存子域),只是说我读过的所有内容都暗示 Django 无法以任何优雅的方式处理这个问题。这可能在 1.1 版中有所改变,但如果是这样的话,我还没有遇到任何关于它的信息。在我的特定应用程序中,无论如何我都无法缓存子域,因此我没有研究可能需要进行哪些内部修改才能使这项工作更好。
但是,关于访问子域视图的方式,您可能会考虑的另一个选项是这样的:
class SubdomainMiddleware:
"""
Make the company specified by the subdomain available to views for
appropriate processing.
"""
def process_request(self, request):
"""
Populate a company attribute on the request object with the company
indicated by the requested subdomain.
"""
domain_parts = request.get_host().split('.')
if (len(domain_parts) > 2):
subdomain = domain_parts[0]
if (subdomain.lower() == 'www'):
subdomain = ''
else:
subdomain = ''
if subdomain != '':
try:
request.company = Company.objects.get(subdomain=subdomain)
except Company.DoesNotExist:
return HttpResponseRedirect(''.join(['http://test.com', reverse('findcompany')]))
else:
request.company = None
我认为这是不言自明的——它是我在djangosnippets上找到的东西的一个经过大量修改的版本。它只是解析子域,在公司表中查找它,如果这是一个有效的公司,它将被附加到请求对象以供视图处理。这样,如果 test.com/test 和 sub.test.com/test 都有效,那么视图可以包含该逻辑,而不是将其推入中间件。此外,垃圾子域很容易传递给搜索 url。
我本来打算将此与您的中间件进行比较(更多的是为了我自己的教育而不是其他任何东西),但是您为代码提供的 URL 返回 404。