這不是直接回答你的問題(「重新請求不同的視圖」),但也許這個解決方案可以解決你的問題。
首先,你把你的中間件,但只使用它來檢測,如果訪問者是一個機器人:
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