2012-11-13 70 views
0

我有一個將移動用戶重定向到移動網站的中間件,但是如果URL是/property/,我想引導他們訪問整個站點。移動重定向正在工作,但不排除/property/爲什麼我的重定向中間件失敗?

這是當前的中間件。

middleware.py

# Adapted from http://djangosnippets.org/snippets/2001/ 
import re 
from django.conf import settings 
from django.http import HttpResponseRedirect 


class MobileRedirectMiddleware(object): 
    """ 
    Redirects mobile users to a different site. 
    """ 
    def process_request(self, request): 
     if self._is_mobile(request): 
      return HttpResponseRedirect(settings.MOBILE_SITE_URL) 

    def _is_mobile(self, request): 
     is_mobile = False 
     NON_MOBILE_REDIRECT_URLS = getattr(settings, 'NON_MOBILE_REDIRECT_URLS', []) 
     if request.path in NON_MOBILE_REDIRECT_URLS: 
      return False 

     if request.META.has_key('HTTP_USER_AGENT'): 
      user_agent = request.META['HTTP_USER_AGENT'] 

      # Test common mobile values. 
      pattern = "(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|windows ce|pda|mobile|mini|palm|netfront)" 
      prog = re.compile(pattern, re.IGNORECASE) 
      match = prog.search(user_agent) 

      if match: 
       is_mobile = True 
      else: 
       # Nokia like test for WAP browsers. 
       # http://www.developershome.com/wap/xhtmlmp/xhtml_mp_tutorial.asp?page=mimeTypesFileExtension 

       if request.META.has_key('HTTP_ACCEPT'): 
        http_accept = request.META['HTTP_ACCEPT'] 

        pattern = "application/vnd\.wap\.xhtml\+xml" 
        prog = re.compile(pattern, re.IGNORECASE) 

        match = prog.search(http_accept) 

        if match: 
         is_mobile = True 

      if not is_mobile: 
       # Now we test the user_agent from a big list. 
       user_agents_test = ("w3c ", "acs-", "alav", "alca", "amoi", "audi", 
            "avan", "benq", "bird", "blac", "blaz", "brew", 
            "cell", "cldc", "cmd-", "dang", "doco", "eric", 
            "hipt", "inno", "ipaq", "java", "jigs", "kddi", 
            "keji", "leno", "lg-c", "lg-d", "lg-g", "lge-", 
            "maui", "maxo", "midp", "mits", "mmef", "mobi", 
            "mot-", "moto", "mwbp", "nec-", "newt", "noki", 
            "xda", "palm", "pana", "pant", "phil", "play", 
            "port", "prox", "qwap", "sage", "sams", "sany", 
            "sch-", "sec-", "send", "seri", "sgh-", "shar", 
            "sie-", "siem", "smal", "smar", "sony", "sph-", 
            "symb", "t-mo", "teli", "tim-", "tosh", "tsm-", 
            "upg1", "upsi", "vk-v", "voda", "wap-", "wapa", 
            "wapi", "wapp", "wapr", "webc", "winw", "winw", 
            "xda-",) 

       test = user_agent[0:4].lower() 
       if test in user_agents_test: 
        is_mobile = True 

     return is_mobile 

settings.py中我有這樣的:

MOBILE_SITE_URL = 'http://mobile.somesite.com/' 
NON_MOBILE_REDIRECT_URLS = ['/property/'] 
+1

好故事。你有沒有問題? – dokkaebi

+0

嗯,是@dokkaebi抱歉,如果我不清楚,但我的問題是如何得到這個不重定向到移動網站,如果URL是/ property /。謝謝。 – tjoenz

回答

1

它可能沒有足夠的,只是爲了避免給定的URL重定向到mobile.。如果用戶已經來自mobile.somesite.com/..../,則需要將他們主動重定向到www.以遠離移動站點。

這是未經測試,但應該是八九不離十:

class MobileRedirectMiddleware(object): 
    """ 
    Redirects mobile users to a different site. 
    """ 
    def process_request(self, request): 
     was_mobile = settings.MOBILE_SITE_URL in request.META.HTTP_REFERER 
     NON_MOBILE_REDIRECT_URLS = getattr(settings, 'NON_MOBILE_REDIRECT_URLS', []) 

     if request.path in NON_MOBILE_REDIRECT_URLS and was_mobile: 
      # redirect them to 'www.somesite.com/.../' 
      return HttpResponseRedirect(settings.MAIN_SITE_URL + request.path.lstrip('/')) 

     if self._is_mobile(request): 
      return HttpResponseRedirect(settings.MOBILE_SITE_URL) 

    def _is_mobile(self, request): 
     is_mobile = False 

     # no longer need to check urls in here 

     if request.META.has_key('HTTP_USER_AGENT'): 
      ... 
+0

謝謝。我嘗試過,但仍然重定向到移動網站。 – tjoenz

+0

你可以瀏覽一下這段代碼,並確認a)request.path就是你認爲的那樣,b)'getattr(settings,'NON_MOBILE_REDIRECT_URLS',[])'返回你認爲它的列表,c )重定向來自這個中間件?你可以將這些值添加到你原來的問題嗎? – dokkaebi

+0

你確定你在你的settings.py文件中包含了你的服裝中間件嗎? – PepperoniPizza