FlaskはオプションのURLパラメータを持つことができますか?


258

フラスコのURLオプションパラメータを直接宣言することはできますか?

現在、私は次の方法を進めています:

@user.route('/<userId>')
@user.route('/<userId>/<username>')
def show(userId, username=None):
    pass

それusernameがオプションであると直接言うにはどうすればよいですか?

回答:


341

別の方法は書くことです

@user.route('/<user_id>', defaults={'username': None})
@user.route('/<user_id>/<username>')
def show(user_id, username):
    pass

しかし、1つのルートを記述して、usernameオプションとしてマークを付けたいと思いますか?もしそうなら、それは可能ではないと思います。


エンドポイントとurl_forを参照するときにこのメソッドを使用すると問題が発生しますか?

2
私が知っていることではありません。Flaskのドキュメントにも同様の例が含まれています(表示するには少し下にスクロールする必要があります)。
AudriusKažukauskas2013年

1
あなたはpip installフラスコ_オプション_ルートを試すことができます。私はあなたが要求している機能のためにpipを作成しましたb / c私もそれを必要としました。コードはgithub.com/sudouser2010/flask_optional_routesにあります。
sudouser2010 2018年

賛成です!ホームページに複数のタブがあり、それぞれが/ one / two / three / fourのようなものをトリガーし、ページをリロードせずに同じページに異なるコンテンツをロードしたい場合、単一のルートまたは複数のルートを使用する必要がありますか?
PirateApp 2018

Flaskだけでは実現できず、純粋にフロントエンド機能である
@PirateApp

183

数か月前にAudriusが作り上げたものとほとんど同じですが、関数ヘッドのデフォルトで少し読みやすいかもしれません-Pythonで慣れている方法:

@app.route('/<user_id>')
@app.route('/<user_id>/<username>')
def show(user_id, username='Anonymous'):
    return user_id + ':' + username

3
また、これusernameは定数でない場合に機能します。defaults=辞書のデフォルト値を凍結します。
kasperhj 2014年

2
私はこれを好む。コードをできる限りクリーンに保つ必要があります。
Light.G 2019年

ここで大きな注意点があることに注意してください:複数の位置引数があり、それらすべてがオプションではない場合、フラスコはURLを正しく構築する方法を理解しません。/ foo?pageのような/ page?arg = fooのようなものを取得できます。その場合、@ AudriusKažukauskasの回答が機能しますが、機能しません
rgargente

73

私のようにFlask-Restfulを使用している場合は、次の方法も可能です。

api.add_resource(UserAPI, '/<userId>', '/<userId>/<username>', endpoint = 'user')

次に、Resourceクラスで:

class UserAPI(Resource):

  def get(self, userId, username=None):
    pass


11
@app.route('/', defaults={'path': ''})
@app.route('/< path:path >')
def catch_all(path):
    return 'You want path: %s' % path

http://flask.pocoo.org/snippets/57/


3
外部リンクからの情報をここに追加する必要があります。そのリンクが無効になると、回答が破損するためです。
tomab 2015年

9
@user.route('/<user_id>', defaults={'username': default_value})
@user.route('/<user_id>/<username>')
def show(user_id, username):
   #
   pass

5

skornosとほぼ同じですが、より明確な回答を得るための変数宣言があります。それはで動作することができフラスコ-RESTfulな拡張子

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

class UserAPI(Resource):
    def show(userId, username=None):
    pass

api.add_resource(UserAPI, '/<userId>', '/<userId>/<username>', endpoint='user')

if __name__ == '__main__':
    app.run()

このadd_resourceメソッドでは、複数のURLを渡すことができます。それぞれがリソースにルーティングされます。


1

私はこの投稿が本当に古いことを知っていますが、フラスコ_オプション_ルートと呼ばれるこれを行うパッケージで作業しました。コードはhttps://github.com/sudouser2010/flask_optional_routesにあります

from flask import Flask

from flask_optional_routes import OptionalRoutes


app = Flask(__name__)
optional = OptionalRoutes(app)

@optional.routes('/<user_id>/<user_name>?/')
def foobar(user_id, user_name=None):
    return 'it worked!'

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000)

0

例に示すように記述できますが、ビルドエラーが発生します。

これを修正するには:

  1. root .pyでapp.url_map()を印刷します
  2. あなたは次のようなものを見ます:

<Rule '/<userId>/<username>' (HEAD, POST, OPTIONS, GET) -> user.show_0>

そして

<Rule '/<userId>' (HEAD, POST, OPTIONS, GET) -> .show_1>

  1. テンプレートよりも、{{ url_for('.show_0', args) }}そして{{ url_for('.show_1', args) }}

-6

Flask 0.10以降では、1つのエンドポイントに複数のルートを追加できません。しかし、偽のエンドポイントを追加することができます

@user.route('/<userId>')
def show(userId):
   return show_with_username(userId)

@user.route('/<userId>/<username>')
def show_with_username(userId,username=None):
   pass

5
何?ここでフラスコ0.10.1を使用すると、1つのエンドポイントに複数のルートを追加できます。
jaapz 14

-8

ブループリントを使用できると思います。これにより、コードがより美しくきれいに表示されます。

例:

from flask import Blueprint

bp = Blueprint(__name__, "example")

@bp.route("/example", methods=["POST"])
def example(self):
   print("example")

これは質問の答えにはなりません。
meyer9 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.