Python 应用程序引擎:如何从类外重定向

Python 应用程序引擎:如何从类外重定向,python,google-app-engine,redirect,webapp2,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=''

因此,我知道您可以从继承自
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']

那么,有没有一种方法可以在类之外执行重定向呢?

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

我这样做的方式是创建自己的
webapp2.RequestHandler
子类,它覆盖
handle\u异常
方法()

使用此功能,您实际上可以创建范围广泛的自定义异常,以便轻松管理期望。例如,您还可以执行一个
NotFound
异常,将状态代码设置为404并呈现一条“Page not found”消息

要进行重定向,请引发
重定向错误


这就像
引发重定向错误(“http://www.google.com“”

为了好玩,我实现了一些错误:
[NotFoundError,LoginRequiredError,LoginDerPrivileged,ForbiddenError,RedirectError]
所以我在实现您的代码时得到了这些:File“/Users/bengrunfeld/Desktop/Work/code/wf ghconsole/console/auth.py”,第53行,在fetch_url raise RedirectError(“)RedirectError INFO 2014-05-22 22:49:38562 module.py:639]默认值:“GET/HTTP/1.1”500 228有什么想法吗?耶@bengrunfeld,请求的处理程序是
MyWebappFramework
的子类吗?”?如果没有,则不会连接
handle\u exception
方法来捕获异常。换句话说,
fetch\u url
是否调用对
MyWebappFramework
子类的回溯?
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)