Flask:获取当前蓝图 webroot

Flask: get current blueprint webroot

我正在构建一个 Flask 应用程序,其蓝图安装在两个不同的端点(一个是另一个的旧别名)。

在我的蓝图中class:

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...

在我的主服务器代码中:

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')

如何获取请求的实际 URL 到路由方法中的 /old_ep/new_ep 部分,例如http://localhost:5000/new_ep?

到目前为止我用过[​​=21=]

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

但它看起来很不优雅并且可能容易出错。如果可能的话,我想使用蓝图设置中的信息。

感谢您的帮助。

编辑: 我可以使用

从请求中获取蓝图实例
current_app.blueprints[request.blueprint]

我希望我在注册蓝图时设置的 url_prefix 属性在那里,但它是 None。当我从 documentation 中读到所谓的相关 iter_blueprints() 方法时,显然列出这些蓝图时没有考虑它们注册了多少次以及使用哪些参数。太糟糕了。

这是一个完整的工作示例,可以根据 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'})