python - 함수 - 장고 템플릿 태그




사용자 에이전트를 기반으로 장고 템플릿 변경 (7)

일부 미들웨어에서 UA를 구문 분석 한 후 사용자를 i.xxx.com으로 리디렉션하는 방법은 무엇입니까? 나는 모바일 사용자들이 어떻게 URL이 어떻게 생겼는지에 대해 신경을 쓰지 만 여전히 메인 URL을 사용하여 사이트에 액세스 할 수 있습니다.

Django 사이트를 만들었지 만 Koolaid를 마셨고 아이폰 버전을 만들고 싶습니다. 많은 생각을 가한 후 두 가지 옵션을 생각해 냈습니다.

  1. i.xxxx.com과 같은 전체 사이트를 만드십시오. Django의 사이트 프레임 워크를 사용하여 동일한 데이터베이스에 연결합니다.
  2. 사용자 에이전트를 읽는 미들웨어를 찾아서 동적으로 템플릿 디렉토리를 변경하십시오.

나는 옵션 # 2를 선호한다. 장고 문서 는 비행 중에 설정을 변경하지 않기 때문에 주로 예약 이 있습니다 . 내가 원하는 것을 할 수있는 발췌 문장 을 발견했습니다. 내 주요 문제는 가능한 한 완벽하게 처리하는 것입니다. 자동 작업이 가능하고 사용자에게 투명 해지고 싶습니다.

다른 누구도 같은 문제에 직면 해 있습니까? 누군가가 장고 사이트의 아이폰 버전을 만드는 방법에 대해 공유하고 싶습니까?

최신 정보

나는 미들웨어 조합과 템플릿 호출을 조정했다.

미들웨어의 경우 미니 레코드를 사용 했습니다 . 내가 모바일 사용자 에이전트의 과다 를 감지하기 때문에 나는 그것을 좋아한다. 내가해야 할 일은 내 의견에서 request.mobile을 확인하는 것뿐입니다.

템플릿 호출을 조정하려면 다음을 수행하십시오.

 def check_mobile(request, template_name):
     if request.mobile:
         return 'mobile-%s'%template_name
     return template_name

나는 내가 두 버전을 가지고 있다는 것을 알고있는 어떤 견해에도 이것을 사용합니다.

할 것:

  • check_mobile ( 'template_name.html')을 사용할 필요가 없도록 render_to_response의 확장 버전에서 request.mobile 에 액세스하는 방법을 설명합니다.
  • 모바일 버전이없는 경우 이전 템플릿을 사용하여 자동으로 일반 템플릿으로 대체합니다.

템플릿 디렉토리를 동적으로 변경하는 대신 요청을 수정하고 사용자가 아이폰에 있는지 여부를 알 수있는 값을 추가 할 수 있습니다. 그런 다음 render_to_response (또는 HttpResponse 객체를 만드는 데 사용하는 것)을 래핑하여 아이폰을 사용하는 경우 표준 html 버전 대신 아이폰 버전의 템플릿을 가져옵니다.


다른 방법은 사용자 에이전트에 특정한 템플릿을로드하는 고유 한 템플릿 로더를 만드는 것입니다. 이것은 꽤 일반적인 기술이며 요청 된 언어 (기존 Django i18n 기계와 잘 어울리는 도구)와 같이 다른 요소에 따라 어떤 템플릿을로드해야 하는지를 동적으로 결정하는 데 사용할 수 있습니다.

Django Book에는 이 주제에 대한 섹션이 있습니다.




최상의 시나리오 : minidetector를 사용하여 요청에 추가 정보를 추가 한 다음 django의 기본 요청 컨텍스트를 사용하여 템플릿에 전달하십시오.

from django.shortcuts import render_to_response
from django.template import RequestContext

def my_view_on_mobile_and_desktop(request)
    .....
    render_to_response('regular_template.html', 
                       {'my vars to template':vars}, 
                       context_instance=RequestContext(request))

템플릿에서 다음과 같은 것들을 소개 할 수 있습니다 :

<html>
  <head>
  {% block head %}
    <title>blah</title>
  {% if request.mobile %}
    <link rel="stylesheet" href="{{ MEDIA_URL }}/styles/base-mobile.css">
  {% else %}
    <link rel="stylesheet" href="{{ MEDIA_URL }}/styles/base-desktop.css">
  {% endif %}
  </head>
  <body>
    <div id="navigation">
      {% include "_navigation.html" %}
    </div>
    {% if not request.mobile %}
    <div id="sidebar">
      <p> sidebar content not fit for mobile </p>
    </div>
    {% endif %>
    <div id="content">
      <article>
        {% if not request.mobile %}
        <aside>
          <p> aside content </p>
        </aside>
        {% endif %}
        <p> article content </p>
      </aricle>
    </div>
  </body>
</html>

미들웨어에서 사용자 에이전트를 탐지하고 URL 바인딩을 전환하여 이익을 얻으십시오!

방법? Django 요청 객체는 .urlconf 속성을 가지며 미들웨어로 설정할 수 있습니다.

django 문서에서 :

Django는 사용할 루트 URLconf 모듈을 결정합니다. 일반적으로 이것은 ROOT_URLCONF 설정의 값이지만 들어오는 HttpRequest 객체에 urlconf (미들웨어 요청 처리로 설정)라는 속성이 있으면 ROOT_URLCONF 설정 대신 해당 값이 사용됩니다.

  1. yourproj / middlware.py에 http_user_agent 문자열을 검사하는 클래스를 작성합니다.

    import re
    MOBILE_AGENT_RE=re.compile(r".*(iphone|mobile|androidtouch)",re.IGNORECASE)
    class MobileMiddleware(object):
        def process_request(self,request):
            if MOBILE_AGENT_RE.match(request.META['HTTP_USER_AGENT']):
                request.urlconf="yourproj.mobile_urls"
  2. settings.py의 MIDDLEWARE_CLASSES에 이것을 추가하는 것을 잊지 마십시오 :

    MIDDLEWARE_CLASSES= [...
        'yourproj.middleware.MobileMiddleware',
    ...]
  3. 모바일 urlconf, yourproj / mobile_urls.py를 만듭니다.

    urlpatterns=patterns('',('r'/?$', 'mobile.index'), ...)




django-middleware