2017-11-14 4 views
1

私は2つの異なるエンドポイントに1つの青写真をマウントしたFlaskアプリケーションを構築しています(もう1つは別のエイリアスです)。私は、ルート方法で/old_epまたは/new_ep一部まで、要求の実際のURLを取得できますかFlask:現在の青写真ウェブルートを取得

app = Flask(__name__) 
app.config.update(config['flask']) 

app.register_blueprint(ldp, url_prefix='/new_ep') 
# Legacy endpoint. @TODO Deprecate. 
app.register_blueprint(ldp, url_prefix='/old_ep') 

:私のメインサーバーコードで

ldp = Blueprint('ldp', __name__) 

@ldp.route('/<path:uuid>', methods=['GET']) 
@ldp.route('/', defaults={'uuid': None}, methods=['GET'], 
     strict_slashes=False) 

def get_resource(uuid): 
    # Route code... 

:私の青写真クラスで

、例えばhttp://localhost:5000/new_ep

これまでのところ私は

request.host_url + request.path.split('/')[1] 

を使用しているが、それは非常に洗練さと、おそらくエラーが発生しやすい見えます。可能であれば、青写真設定からの情報を使用したいと思います。

ありがとうございました。

EDIT:私は

current_app.blueprints[request.blueprint] 

でリクエストの中から青写真インスタンスに得ることができると私は青写真を登録するとき、私は設定url_prefix属性があったことを願っていたが、それは代わりにNoneです。おそらく関連するiter_blueprints()メソッドのdocumentationから読んだように、これらの青写真は、何回登録されたか、何回パラメータが登録されたかに関わらず、明らかに列挙されています。残念な。ここで

+0

使用オフに基づいて2つの異なる名前を取得するには、完全な実施例であるとそれに応じてインスタンス化する。 'old_ep'に対して' app.register_blueprint(oldep、url_prefix = '/ old_ep') 'と' oldep = Blueprint( "oldep"、__name__)を実行し、 'app.register_blueprint()'で置き換えて 'new_ep ' 。 'oldep.route( '/'、methods = ['GET'])'は 'http:// localhost:5000/old_ep'にルーティングします。 – GeekSambhu

+0

あなたが探している答えではありませんが、URLのデフォルトを使ってこの問題を解決できます。https://github.com/pallets/flask/issues/612#issuecomment-15464107 –

+0

@GeekSambhu非常に複雑なコード変更のようです。私が理解すれば、私は青写真のすべてのルートを2倍にしなければならないでしょう。もしエンドポイントが最終的に非難されたら、私はそれらを削除しなければなりませんか?その時点で、現在のソリューションは、まばゆいですが、1ライナーに過ぎません。 – user3758232

答えて

1

は `app.register_blueprint( " "、URL_PREFIX = ' ')`でアイデア issue 612

from flask import Flask, Blueprint, url_for, request, g 

bp = Blueprint('whatever', __name__) 

@bp.url_defaults 
def bp_url_defaults(endpoint, values): 
    url_prefix = getattr(g, 'url_prefix', None) 
    if url_prefix is not None: 
     values.setdefault('url_prefix', url_prefix) 

@bp.url_value_preprocessor 
def bp_url_value_preprocessor(endpoint, values): 
    g.url_prefix = values.pop('url_prefix') 

@bp.route('/something') 
def index(): 
    return 'host prefix is %s%s' % (request.host_url, g.url_prefix) 

app = Flask(__name__) 

app.register_blueprint(bp, url_prefix='/new_ep', url_defaults={'url_prefix': 'new_ep'}) 
app.register_blueprint(bp, url_prefix='/old_ep', url_defaults={'url_prefix': 'old_ep'}) 

Web Output example

+0

ありがとう@ジョシュ - g。問題の「ハッキング」に関する解説にもかかわらず、これは期待通りに機能します。 – user3758232

+0

私は、ハック部分がURL接頭辞に直接アクセスする代わりに2回指定する必要があると思います –

関連する問題