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

在我的蓝图课程中:

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

到目前为止,我已经使用

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


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

谢谢你的帮助。

编辑:我可以从请求中进入Blueprint实例

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


python - Flask:获取当前的蓝图webroot-LMLPHP

关于python - Flask:获取当前的蓝图webroot,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47277374/

10-14 04:22