2016-07-20 9 views
4

私はいくつかのURLパスを持っており、FlaskアプリケーションのURLルールを指しているかどうかをチェックしたいと思います。どのように私はフラスコを使用してこれをチェックできますか?URLと一致するFlaskビュー関数を取得します

from flask import Flask, json, request, Response 

app = Flask('simple_app') 

@app.route('/foo/<bar_id>', methods=['GET']) 
def foo_bar_id(bar_id): 
    if request.method == 'GET': 
     return Response(json.dumps({'foo': bar_id}), status=200) 

@app.route('/bar', methods=['GET']) 
def bar(): 
    if request.method == 'GET': 
     return Response(json.dumps(['bar']), status=200) 
test_route_a = '/foo/1' # return foo_bar_id function 
test_route_b = '/bar' # return bar function 
+0

[url_for](http://flask.pocoo.org/docs/0.11/quickstart/#url-building)に興味があるかもしれません。 – squiguy

+0

@squiguy、 'url_for'は' endpoint'とオプションの 'values'からurlを生成します。私はurlを取って、もしそれにマッチするなら、関連する 'endpoint'を見つけようとしています。ある意味では、私は 'url_for'の反対が必要です。 –

答えて

11

app.url_map店舗マップとは、エンドポイントでのルールに一致するオブジェクト。 app.view_functionsは、エンドポイントをビュー機能にマップします。

URLをエンドポイントと値に一致させるには、matchを呼び出します。ルートが見つからない場合は404を、そうでない場合は405を生成します。一致するURLと同様にメソッドが必要です。

リダイレクトは例外として扱われますので、これらを再帰的に捕捉してテストして、ビュー機能を見つける必要があります。

ビューにマップしないルールを追加することができます。ビューをルックアップするときには、KeyErrorをキャッチする必要があります。

from werkzeug.routing import RequestRedirect, MethodNotAllowed, NotFound 

def get_view_function(url, method='GET'): 
    """Match a url and return the view and arguments 
    it will be called with, or None if there is no view. 
    """ 

    adapter = app.url_map.bind('localhost') 

    try: 
     match = adapter.match(url, method=method) 
    except RequestRedirect as e: 
     # recursively match redirects 
     return get_view_function(e.new_url, method) 
    except (MethodNotAllowed, NotFound): 
     # no match 
     return None 

    try: 
     # return the view function and arguments 
     return app.view_functions[match[0]], match[1] 
    except KeyError: 
     # no view is associated with the endpoint 
     return None 

試合が行われた方法を達成するためにbindに渡すことができ、より多くのオプション、詳細についてはドキュメントを参照してくださいがあります。

ビュー機能は、404エラー(またはその他のエラー)を発生させる可能性もあるため、URLがビューに一致し、ビューが200応答を返さないことが保証されます。

関連する問題