2

301 リダイレクトを実行しようとしている Google アプリ エンジンで実行されている Python ミドルウェア クラスがあります。

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 App Engine でエラーを生成します。

これは私の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.yamlPython プロジェクトのファイルで、ハンドラー セクションに次の行を含めます。

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