2011-11-09 11 views
9

私は、ユーザーがRESTインターフェースを指定できる情報をユーザーが保存できるようにするアプリケーションを作成しています。 IE、/<username>/rest/productsに製品のリストを保管してください。 URLは明らかにわからないので、私はFlaskで動的URL作成を実装する最良の方法を考えようとしていました。私が考えた最初の方法は、キャッチオールルールを作成し、そこからURLをルーティングすることです。しかし、私は基本的にFlaskがすでにそれらを組み込んでいるときにURLルーティング機能を複製しています。だから、.add_url_rule()docs here、スクロールダウン)を使ってアプリに直接添付するのは悪い考えですか?これをしてはならない特別な理由はありますか?FlaskアプリにURLルールを動的に追加

答えて

12

add_url_rule()を実行するたびに、内部ルーティングがURLマップを再マップします。これはスレッドセーフでも高速でもありません。私は今、正直であるためにユーザー固有のURLルールが必要な理由を理解していません。ユーザー固有のアプリケーションを実際にマウントしたいと思うようですね。

多分これは便利です:http://flask.pocoo.org/docs/patterns/appdispatch/

+0

私は、[register_resource]メソッドを使って[Eve](http://python-eve.org)で構築されたAPIに新しいエンドポイントを動的に追加する方法を探しています。内部でadd_url_ruleを実行します。これはすべての要求に対して起こるわけではなく、特定のエンドポイントへの 'POST'が受信されたときだけフックによってトリガされるので、パフォーマンスは問題ではないはずです。 – kynan

+0

ここでの要件はまったく同じです。 PUTリクエストが特定のルートで発生するたびに新しいルートを追加および削除する必要があるApi。私の場合、私はフラスコを安心して使っていますが、基本的に同じです。 – cllamach

+0

threading.lockを使用するとbefore_requestでこれを行うことができますが、url_forで次のエラーが発生するのを防ぐ方法がわかりません:ValueError:ソートエラー時にリストが変更されました:app:Internal Server Error、list modifiedソート中 – pip

0

SOMEID与えられたため、各エンドポイント/<SOMEID>/rest/otherが異なる機能に制限されるべき場所、私は自分のアプリケーションのための同様の要件を持っていました。これを達成する1つの方法は、値が特定のSOMEIDを処理する関数であるルックアップ辞書を保持することです。例えば、このスニペットを見てみましょう:

func_look_up_dict = {...} 
@app.route('<SOMEID>/rest/other', methods=['GET']) 
def multiple_func_router_endpoint(SOMEID): 
    if SOMEID in func_look_up_dict.keys(): 
     return jsonify({'result' = func_look_up_dict[SOMEID]()}), 200 
    else: 
     return jsonify({'result'='unknown', 'reason'='invalid id in url'}), 404 

ので、このケアのためにあなたが本当に「動的」URLルールを追加する必要はありませんが、むしろパラメータでURLルールを使用して、単一のwithing様々なケースを扱います関数。もう一つ考慮すべき点は、そのようなURLエンドポイントの使用例について実際に考えることです。 <username>が渡される必要があるパラメータの場合は、/rest/product/<username>などのURLルールを使用しないでください。それとも、GETリクエストの引数として渡してください。 希望に役立ちます。

関連する問題