App Engine:如何从类外部重定向

时间:2014-05-22 22:01:51

标签: python google-app-engine redirect webapp2

所以我知道你可以使用以下内容从一个继承自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

如果您可以从该功能重定向,则可以检查状态代码并重定向到错误页面。 E.g。

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 个答案:

答案 0 :(得分:1)

您可以创建自己的Exception子类来处理重定向。

我这样做的方法是使我自己的webapp2.RequestHandler子类覆盖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)

使用此功能,您实际上可以制作各种自定义例外以轻松管理期望。例如,您可能还会设置NotFound例外,将状态代码设置为404并呈现"未找到页面"消息。

要进行重定向,请提升RedirectError

它就像raise RedirectError("http://www.google.com")一样简单。