1. ホーム
  2. パイソン

[Flask】Flaskにおけるurl_for()の落とし穴とは?

2022-02-28 09:13:09
<パス

概要

Flaskの開発には必ずと言っていいほど落とし穴があるのですが、ここではflaskのユニットテストを使っているときに遭遇したurl_for()について踏み込みました。

落とし穴

<ブロッククオート

url_for()関数は、指定された 機能 のURLを指定します。

url_for オペレーションオブジェクトは 機能 であり、ルート内のパスではありません。

ルートと関数名が異なり、url_for()を使用してエラーが発生した場合、エラーを見つけるためにルートに移動しないでください。
例えば、以下のようなコードです。

from flask import Flask, url_for
app = Flask(\__name__)

@app.route('/')
def index():
    pass

@app.route('/login')
def LOGIN():
    pass

with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
print(url_for('index'))

print(url_for('login')) エラーは報告されず、バックスラッシュが表示されるだけです。 with app.test_request_context(): print(url_for('index')) print(url_for('LOGIN')) エラー報告、BuildError例外を投げる。

/
トレースバック (最も最近のコールバック):
ファイル "<\pyshell#12>", 行 3, in.
print(url_for('ログイン'))
File "C:\Python35╱Packages╱flaskhelpers.py", line 332, in url_for
return appctx.app.handle_url_build_error(error, endpoint, values)
ファイル "C:³³³³³.py", 行 1811, in handle_url_build_error
reraise(exc_type, exc_value, tb)
File "C:\Python35╱Packages╱flask_compat.py" line 33, in reraise
値を上げる
File "C:³³³³³.py" line 322, in url_for
force_external=external)
ファイル "C:³³³³³.py", 行 1758, in build
raise BuildError(endpoint, values, method, self) ビルドエラーを発生させる。
BuildError: エンドポイント 'login' の url をビルドできません。代わりに 'index' を意味するのですか?

ログインをLOGINに変更。

url_for()

正しく印刷されました。

/
/ログイン

パラメータ

_external また、完全なURLが必要な場合など、いくつかのパラメータを設定することができます。 url_for('.static',_external=True,filename='pic/test.png') をTureとする。

True

この方法で返されるurlは http://localhost/static/pic/test.png

  • エンドポイント
    URLのエンドポイント(関数名)

  • URLの可変パラメータ
  • 外部
    に設定した場合 True を指定すると、絶対パス URL が生成されます。
  • スキーム
    希望するURLスキームを指定する文字列。external パラメータを True に設定しないと ValueError がスローされます。
  • アンカー
    これが設定されている場合、URLにmaoを追加します。
  • メソッド
    これを設定すると、このHTTPメソッドが表示単位で呼び出されます。

参考にしてください。 http://dormousehole.readthedocs.io/en/latest/api.html#flask.url_for


この記事の最終更新日:2016年12月