我有一个在谷歌应用引擎中运行的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)
答案 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)