2

我有一个在谷歌应用引擎中运行的 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 重定向的任何信息!所有信息都与从处理程序或其他框架执行此操作有关,这些方法都会在谷歌应用引擎中产生错误。

这是我的 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)
4

2 回答 2

1

我猜问题是你的中间件是你的应用程序的外包装。当您从应用程序内部引发异常时,它会被默认的 webapp 中间件捕获并设置状态代码。但是,由于您的中间件不在此范围内,因此没有什么可以抓住它。

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

if response.status_int == 404:
    start_response('301 Redirect', [('Location', 'http://www.example.com/'),])
    return []
else:
    return response(environ, start_response)
于 2013-09-20T13:29:02.337 回答
0

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

handlers: 
- url: /.* 
  redirect_http_response_code: 301
于 2014-12-18T21:24:49.263 回答