[解決済み] すべての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
サーバーのどちらかになります。
関連
-
[解決済み】Pythonのvirtualenvを離脱/終了/無効化する方法
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] Flaskで静的ファイルを提供する方法
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] Pythonの要素別タプル演算(sumなど
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複