我正在构建一个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,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47277374/