这不是直接回答你的问题(“重新请求不同的视图”),但也许这个解决方案可以解决你的问题。
首先,你把你的中间件,但只使用它来检测,如果访问者是一个机器人:
def process_request(self, request):
request.is_bot = is_bot(request) # assuming you have a function for detecting bots
return
然后创建调用特定的方法时request.is_bot
是真正的一类基于视图:
class BotViewMixin(object):
def dispatch(self, request, **kwargs):
if request.is_bot:
return self.handle_bot()
return super(BotViewMixin, self).dispatch(request, **kwargs)
然后,您可以随时随地继承此视图(例如,用于您的主页视图)。你只需要在你的视图上创建一个handle_bot
方法,它会返回你的机器人响应。该解决方案的
优点:
- 你并不需要编写机器人不同的看法,只需要创建一个专用的方法
- 你不阻止其他中间件
- 你的逻辑留在你的视图(而不是在你的中间件中)
虽然没有经过测试,所以你可能需要修改代码。
编辑:
由于您使用和NewRelic的必须使用,以便机器人专用的视图来获得准确的统计数据,这种方法不会为你工作。
你可以去中间件的东西,仍然让所有的中间件工作。你只要把最后你自己的中间件在MIDDLWARE_CLASSES:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.CrawlerDetector',
)
另外,我觉得你应该写两个中间件方法:process_request
检测机器人,并process_view
重定向漫游器专用视图。
下面的代码也许应该为你的情况下工作:
from django.core.urlresolvers import reverse
class CrawlerDetector(object):
def process_request(self, request):
"""detect if the user agent is a bot"""
user_agent = request.META.get('HTTP_USER_AGENT', "")
request.is_bot = self.is_crawler(user_agent)
return
def process_view(request, view_func, view_args, view_kwargs):
if request.is_bot and request.path == reverse('home_page'):
return HtmlRendererView().get(request)
return
更新:改变path_info不起作用。 – 2014-09-22 16:39:22