在谷歌应用引擎中的python中间件301重定向

时间:2013-09-20 12:21:16

标签: python google-app-engine redirect

我有一个在谷歌应用引擎中运行的python中间件类,我正在尝试执行301重定向:

from webob import Request
from webob.exc import HTTPMovedPermanently
from urlparse import urlparse

class MyMiddleware(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        request = Request(environ)
        response = request.get_response(self.app)
        if response.status_int == 404:
            raise HTTPMovedPermanently(location="/")
        return response(environ, start_response)

这是一个简化版本,但说明了问题。我找不到任何有关如何从中间件执行302/301重定向的信息!所有信息都与从处理程序或其他框架中执行此操作有关,这些方法都会在Google应用引擎中产生错误。

这是我的main.py:

import os
import webapp2
import jinja2
from seo import *
from notfound import *

JINJA_ENVIRONMENT = jinja2.Environment(
    loader = jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions = ['jinja2.ext.autoescape'])

class MainHandler(webapp2.RequestHandler):
def get(self):
    template = JINJA_ENVIRONMENT.get_template('home.html')
    self.response.write(template.render())

app = webapp2.WSGIApplication([
('/', MainHandler)
], debug = True)

app = MyMiddleware(app)

2 个答案:

答案 0 :(得分:2)

在python项目的app.yaml文件中,在处理程序部分中包含以下行。

handlers: 
- url: /.* 
  redirect_http_response_code: 301

答案 1 :(得分:1)

我猜测问题是您的中间件是您应用的外包装。当您从应用程序内部引发异常时,它会被默认的Web应用程序中间件捕获并设置状态代码。但是,由于您的中间件不在其中,因此无法捕获它。

但是我认为在这种情况下不需要例外。您要做的就是设置302状态代码和位置标题。所以就这样做:

if response.status_int == 404:
    start_response('301 Redirect', [('Location', 'http://www.example.com/'),])
    return []
else:
    return response(environ, start_response)