2013-10-28 18 views
6

Flask内のURLを解決して、すべての引数の辞書だけでなく、エンドポイントへの参照を取得する適切な方法は何でしょうか?例を提供するために、FlaskのURLをエンドポイント+引数に戻す

は、このルートを与え、私は{'username': 'nick'}profile'/user/nick'を解決したいと思います。これまでの私の研究から

@app.route('/user/<username>') 
def profile(username): pass 

、フラスコ内のすべてのルートがapp.url_mapの下に格納されています。マップはwerkzeug.routing.Mapのインスタンスであり、原則として私が探しているものを行う方法match()を持っています。ただし、そのメソッドはクラスの内部にあります。

+2

なぜこれをやりたいのですか?このようなことはFlask自身(通常、Mapの 'match()'メソッドを使用して処理されます)。なぜあなたはフラスケがすでにしていることをする必要がありますか? –

+1

@MarkHildreth:リソースURLを引数として取得し、それをデコードしてエンドポイントと引数に戻す必要がある場合は、これをRESTful APIに使用します。 – Miguel

+0

これはまさに私のシナリオです。私はRESTサービスを構築しています。 – lyschoening

答えて

10

これは私がurl_for()を見て、それを逆にこの目的のためにハッキングです:

from flask.globals import _app_ctx_stack, _request_ctx_stack 
from werkzeug.urls import url_parse 

def route_from(url, method = None): 
    appctx = _app_ctx_stack.top 
    reqctx = _request_ctx_stack.top 
    if appctx is None: 
     raise RuntimeError('Attempted to match a URL without the ' 
          'application context being pushed. This has to be ' 
          'executed when application context is available.') 

    if reqctx is not None: 
     url_adapter = reqctx.url_adapter 
    else: 
     url_adapter = appctx.url_adapter 
     if url_adapter is None: 
      raise RuntimeError('Application was not able to create a URL ' 
           'adapter for request independent URL matching. ' 
           'You might be able to fix this by setting ' 
           'the SERVER_NAME config variable.') 
    parsed_url = url_parse(url) 
    if parsed_url.netloc is not "" and parsed_url.netloc != url_adapter.server_name: 
     raise NotFound() 
    return url_adapter.match(parsed_url.path, method) 

このメソッドの戻り値は最初の要素はとエンドポイント名と第二の辞書であることと、タプルです議論。

私はそれを広範囲にテストしていませんが、すべてのケースで私にとってはうまくいきました。

2

私は答えに遅れて来ていることは知っていますが、私は同じ問題に遭遇し、それを取得する簡単な方法を見つけました:request.view_args。私の見解で

profile.html

@app.route('/user/<username>') 
def profile(username): 
    return render_template("profile.html") 

:たとえば {{}} request.view_args

URL http://localhost:4999/user/samを訪問し、私が取得:{'username': u'sam'}

request.endpointでビューを取得した関数の名前を取得することもできます。

+1

こんにちはサム、私の質問は、必ずしも現在訪問されているものではなく、任意のURLのエンドポイントを取得することでした。 – lyschoening

関連する問題