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'})
我正在构建一个 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'})