1. ホーム
  2. python

[解決済み] すべてのFlaskルートにプレフィックスを追加する

2022-07-27 23:39:55

質問

すべてのルートに追加したいプレフィックスがあります。 今は、定義ごとにルートに定数を追加しています。 これを自動的に行う方法はありますか。

PREFIX = "/abc/123"

@app.route(PREFIX + "/")
def index_page():
  return "This is a website about burritos"

@app.route(PREFIX + "/about")
def about_page():
  return "This is a website about burritos"

どのように解決するのですか?

答えは、このアプリケーションをどのように提供しているかによります。

別のWSGIコンテナの中にサブマウントされる

このアプリケーションを WSGI コンテナ (mod_wsgi, uwsgi, gunicorn など) の内部で実行すると仮定すると、実際には、以下のようにする必要があります。 をマウントし、そのプレフィックスで を WSGI コンテナのサブパートとしてマウントし (WSGI を話すものであれば何でも構いません)、そして APPLICATION_ROOT の設定値をあなたのプレフィックスに設定します。

app.config["APPLICATION_ROOT"] = "/abc/123"

@app.route("/")
def index():
    return "The URL for this page is {}".format(url_for("index"))

# Will return "The URL for this page is /abc/123/"

を設定することで APPLICATION_ROOT を設定すると、Flask のセッションクッキーをその URL プレフィックスに制限するだけです。 他のすべては、FlaskとWerkzeugの優れたWSGI処理機能によって、自動的に処理されるでしょう。

アプリを適切にサブマウントする例

最初の段落の意味がよくわからない場合は、Flaskを内部にマウントしたこのサンプルアプリケーションを見てみてください。

from flask import Flask, url_for
from werkzeug.serving import run_simple
from werkzeug.wsgi import DispatcherMiddleware

app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/abc/123'

@app.route('/')
def index():
    return 'The URL for this page is {}'.format(url_for('index'))

def simple(env, resp):
    resp(b'200 OK', [(b'Content-Type', b'text/plain')])
    return [b'Hello WSGI World']

app.wsgi_app = DispatcherMiddleware(simple, {'/abc/123': app.wsgi_app})

if __name__ == '__main__':
    app.run('localhost', 5000)

アプリへのリクエストのプロキシ

一方、Flask アプリケーションを WSGI コンテナのルートで実行し、そこへのリクエストをプロキシする場合(例えば FastCGI している場合や nginx が proxy_pass -サブエンドポイントへのリクエストをスタンドアローンの uwsgi / gevent サーバーのどちらかになります。

  • で Miguel が指摘しているように、ブループリントを使用する。 彼の回答 .
  • または を使用します。 DispatcherMiddleware から werkzeug (または PrefixMiddleware から su27さんの回答 ) を使って、使用しているスタンドアロン WSGI サーバにアプリケーションをサブマウントしてください。 (参照 アプリを適切にサブマウントする例 を参照してください)。