2010-08-23 3 views
2

리퍼러가보기 인 경우 추천 URL에 대한 뒤로 링크를 만들 수 있고,보기가 아닌 경우 기본 페이지의 뒤로 링크 (묻지 않음) ... 일종의 이상한 요구 사항).django에서 참조보기로 이동하는 URL 링크를 만들려면 어떻게해야합니까?

기본적으로 동일한 장고 사이트의 다른보기에서 해당 페이지로 이동 한 경우 뒤로 링크는 해당보기로 돌아와야합니다.

사용자가 외부 사이트에서 들어온 경우 뒤로 링크는 기본보기로 이동해야합니다.

자바 스크립트는 이상적인 솔루션은 아니지만 다른 방법이 없다면 자바 스크립트를 고려해 볼 수 있습니다.

답변

4

내부 Django URL인지 여부를 확인하려면 django.core.urlresolvers.resolve을 사용하십시오. 그렇지 않은 경우 django.core.urlresolvers.Resolver404을 발생시킵니다. 그렇지 않으면 필요한 경우 인트로 스펙 트할 수있는 일치 개체가 반환됩니다. 필요한 경우 REFERER 환경 변수에이 환경 변수를 입력하고 resolve이 Resolver404를 발생시키는 경우 URL을 기본 URL로 바꿀 수 있습니다.

편집 : 실제로는 아니요, resolve은 URL의 경로 구성 요소에서만 작동합니다. 따라서 올바른 도메인인지 확인하기 위해 urlparse을 사용하여 REFERER 헤더를 해체해야합니다. 그렇다면 URL이 Django 사이트의 일부인지 아닌지 알아보기 위해 구문 분석 된 URL의 경로 구성 요소에 resolve을 사용하십시오 .

# code not tested, YMMV, etc. 

from urlparse import urlparse 

from django.core import urlresolvers 

HOME = 'http://my.site.com/' 

def generate_back_url(url, default_url=HOME): 
    parsed = urlparse(url) 
    if parsed.netloc == 'my.site.com': 
     try: 
      urlresolvers.resolve(parsed.path) 
     except urlresolvers.Resolver404: 
      back_url = default_url 
     else: 
      back_url = url 
    else: 
     back_url = default_url 
    return back_url 

# ... 

def my_view(request): 
    # ... 
    # truth be told I'm not sure whether the .get() is necessary, sorry. 
    back_url = generate_back_url(request.META.get('REFERER', HOME)) 
    # ... 
2

django.utils.http.is_safe_url()을 대신 사용하십시오.

from django.utils.http import is_safe_url 

def my_view(request): 
    # ... 
    if is_safe_url(url=url, host=request.get_host()): 
     back_url = url 
    else: 
     back_url = default_url 
관련 문제