문제

나는 django 사이트를 만들었지 만 Koolaid를 마셨고 나는 iPhone 버전. 많은 생각을 한 후 나는 두 가지 옵션을 생각해 냈습니다.

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

그러나 나는 옵션 #2를 선호합니다. 주로 Django 문서가 있기 때문에 약간의 예약이 있습니다. 변화하는 설정을 즉석에서 권장하지 않습니다. 나는 a를 찾았다 단편 그것은 내가 좋아하는 일을 할 것입니다. 내 주요 문제는 가능한 한 완벽하게 사용하는 것입니다. 자동 지식이되고 사용자에게 투명하기를 바랍니다.

다른 사람이 같은 문제를 발견 했습니까? Django 사이트의 iPhone 버전 제작을 어떻게 해결했는지에 대해 공유하는 사람이 있습니까?

업데이트

나는 미들웨어의 조합을 가지고 템플릿 호출을 조정했습니다.

미들웨어의 경우 사용했습니다 미니 메이트 텍터. 나는 그것이 a를 감지하기 때문에 그것을 좋아한다 과다 모바일 사용자 에이전트의. 내가해야 할 일은 request.mobile 내 견해에 있습니다.

템플릿 호출 조정의 경우 :

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

나는 두 버전을 모두 가지고 있다는 것을 알고있는 모든 견해에 이것을 사용합니다.

할 것:

  • 액세스 방법을 알아 내십시오 request.mobile 확장 된 버전의 render_to_response에서 check_mobile ( 'template_name.html')을 사용할 필요가 없습니다.
  • 모바일 버전이없는 경우 이전 자동으로 일반 템플릿으로의 자동으로 폴백을 사용합니다.
도움이 되었습니까?

해결책

템플릿 디렉토리를 동적으로 변경하지 않고 요청을 수정하고 사용자가 iPhone에 있는지 여부를 알 수있는 값을 추가 할 수 있습니다. 그런 다음 iPhone을 사용하는 경우 표준 HTML 버전 대신 템플릿의 iPhone 버전을 잡아 Render_To_Response (또는 HTTPresponse 객체를 작성하는 데 사용하는 모든 것)를 랩합니다.

다른 팁

미들웨어에서 사용자 에이전트를 감지하고 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 모바일 확장자 인 Djangobile을 개발하고 있습니다. http://code.google.com/p/djangobile/

당신은 Django-Mobileadmin 이 문제를 정확히 해결 한 소스 코드.

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

Django Book은 a 이 주제에 대한 섹션.

다른 템플릿으로 동일한 데이터를 렌더링하는 방법을 설명하는 멋진 기사가 있습니다.http://www.postneo.com/2006/07/26/acknowledging-the-mobile-web-with-django

그러나 여전히 사용자를 모바일 사이트로 자동 리디렉션해야하며 여러 방법을 사용하여 수행 할 수 있습니다 (Check_Mobile 트릭도 작동합니다).

일부 미들웨어에서 UA를 구문 분석 한 후 i.xxx.com으로 사용자를 리디렉션하는 것은 어떻습니까? 모바일 사용자가 URL의 모습을 관리하는 것이 여전히 기본 URL을 사용하여 사이트에 액세스 할 수 있다는 것을 의심합니다.

가능한 최상의 시나리오 : 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>

간단한 해결책은 래퍼를 만드는 것입니다 django.shortcuts.render. 나는 내 a에 넣었다 utils 내 응용 프로그램의 루트에있는 라이브러리. 래퍼는 "모바일"또는 "데스크탑"폴더에서 템플릿을 자동으로 렌더링하여 작동합니다.

~ 안에 utils.shortcuts:

from django.shortcuts import render
from user_agents import parse

def my_render(request, *args, **kwargs):
  """
  An extension of django.shortcuts.render.

  Appends 'mobile/' or 'desktop/' to a given template location
  to render the appropriate template for mobile or desktop

  depends on user_agents python library
  https://github.com/selwin/python-user-agents

  """
  template_location = args[0]
  args_list = list(args)

  ua_string = request.META['HTTP_USER_AGENT']
  user_agent = parse(ua_string)

  if user_agent.is_mobile:
      args_list[0] = 'mobile/' + template_location
      args = tuple(args_list)
      return render(request, *args, **kwargs)
  else:
      args_list[0] = 'desktop/' + template_location
      args = tuple(args_list)
      return render(request, *args, **kwargs)

~ 안에 view:

from utils.shortcuts import my_render

def home(request):    return my_render(request, 'home.html')
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top