2014-05-22 2 views
0

그래서 난 당신이 사용 webapp2.RequestHanlder에서 상속 클래스 내에서 GAE에 리디렉션 할 수 있습니다 알고 :이, 그것으로 좋은 것 작동하지만앱 엔진 : 클래스의 외부에서 리디렉션하는 방법

class Foo(webapp2.RequestHandler): 
    def get(self): 
     self.redirect('https://google.com') 

을 클래스 외부에서 리디렉션을 수행 할 수 있어야합니다. 당신이 함수에서 리디렉션 할 수 있다면

def fetch_url(url, method=urlfetch.GET, data=''): 
    """Send a HTTP request""" 

    result = urlfetch.fetch(url=url, method=method, payload=data, 
          headers={'Access-Control-Allow-Origin': '*'}) 

    return result.content 

, 당신이 상태 코드를 확인할 수 있습니다 : 그것은 내부 클래스의 존재하지 않는, 즉 - 예를 들어

, 당신은 전역 함수가 다음과 같은 코드가 있다고 가정 해 오류 페이지로 리디렉션하십시오. 예 :

if result.status_code != 200: 
    urllib2.urlopen('/error_page.html') 
    return 

불행히도 위의 코드는 GAE에는 아무런 영향을 미치지 않으며 다음 경고가 생성됩니다.

WARNING 2014-05-22 21:58:24,364 urlfetch_stub.py:482] Stripped prohibited headers from URLFetch request: ['Host'] 

클래스 외부에서 리디렉션을 수행하는 방법이 있습니까?

답변

1

Exception 하위 클래스로 리디렉션을 처리 할 수 ​​있습니다.

I는이 기능을 사용 handle_exception 방법 (See the docs)

class RedirectError(Exception): 
    def __init__(self, new_url): 
     self.new_url = new_url 

class MyWebappFramework(webapp2.RequestHandler): 
    def handle_exception(self, exception, debug_mode): 
     if isinstance(exception, RedirectError): 
      self.redirect(exception.new_url) 
     else: 
      super(MyWebappFramework, self).handle_exception(exception, debug_mode) 

을 무시 webapp2.RequestHandler 내 자신의 서브 클래스를 만드는 것입니다 할 방법은 실제로 쉽게 기대를 관리 할 수있는 사용자 정의 예외의 넓은 범위를 만들 수 있습니다 . 예를 들어 NotFound 예외를 생성하여 상태 코드를 404로 설정하고 "페이지를 찾을 수 없음"이라는 메시지를 렌더링 할 수 있습니다.

리디렉션을 수행하려면 RedirectError을 발생 시키십시오.

간단하게는 raise RedirectError("http://www.google.com")입니다.

+0

재미를 위해, 여기에 내가 구현 한 일부 오류는 : 나는 당신의 코드를 구현할 때''[NotFoundError는 LoginRequiredError는 LoginUnderPrivileged는 ForbiddenError는 RedirectError]'' – Josh

+0

그래서 난이 얻을 : 파일을 "/ 사용자/bengrunfeld/데스크탑 /Work/code/wf-ghconsole/console/auth.py ", 줄 53, fetch_url에서 raise RedirectError ("http://www.google.com ") RedirectError 정보 2014-05-22 22:49 : 38,562 module.py:639] 기본값 : "GET/HTTP/1.1"500 228 아이디어가 있으십니까? – Ben

+0

네, @BenGrunfeld는 요청에 대한 핸들러이고,''MyWebappFramework''의 하위 클래스입니까? 그렇지 않다면,''handle_exception'' 메쏘드는 예외를 잡기 위해 연결되지 않습니다. 즉,''fetch_url'' 호출은''MyWebappFramework'' 서브 클래스로 역 추적합니까? – Josh