当前烧瓶蓝图中所有端点的方法(http动词)

时间:2014-06-03 20:35:47

标签: rest url http-method flask

我正在尝试为每个RESTful API端点生成相关链接而不仅仅是当前请求。另一种可接受的方式是,我想生成当前蓝图的所有端点(在本例中称为'blueprint_name')。这是我当前设置的摘要:

def function_that_generates_links():
   #what should I put here?

blueprint_name = Blueprint('blueprint_name', __name__, url_prefix='/blueprint_name')

@blueprint_name.route('/', methods=['GET'])
def endpoint_name():
   #regular_data_being_sent_out is defined somewhere here
   return jsonify(data=regular_data_being_sent_out,
                  links=function_that_generates_links())

@blueprint_name.route('/other_place', methods=['POST'])
def endpoint_name_other():
   #regular_data_being_sent_out is defined somewhere here
   return jsonify(data=regular_data_being_sent_out,
                  links=function_that_generates_links())
@blueprint_name.route('/another_place', methods=['DELETE'])
def endpoint_name_another_place():
   #regular_data_being_sent_out is defined somewhere here
   return jsonify(data=regular_data_being_sent_out,
                  links=function_that_generates_links())

@blueprint_name.route('/yet_another_place', methods=['PUT'])
def endpoint_name_yet_another_place():
   #regular_data_being_sent_out is defined somewhere here
   return jsonify(data=regular_data_being_sent_out,
                  links=function_that_generates_links())

我想将每个端点发出的每个响应附加到所有其他端点的相应http'签名'。在上面的示例代码中,'function_that_generates_links()'将是执行此操作的函数。我已经发现 url_encode()提供了我可以使用的必要链接,但我也想要相应的http动词(GET,POST,DELETE等)。它找到了我坚持使用的相应的http-verb /方法。动词很重要,因为没有它,链接就不完整/无用。

3 个答案:

答案 0 :(得分:1)

马克,

request.method将返回用于调用您所在路径的方法。例如,如果我有:

@bluprint_name.route('/someresource', methods=["GET", "POST", "DELETE"]):
def return_a_resource():
    return request.method

这将打印客户端使用的方法。

要清楚,您无法在网址本身中对方法进行编码。客户端必须从不同的字段读取方法并适当地调用URL。网址只是位置和交通工具。

答案 1 :(得分:0)

您可以使用app.url_map.iter_rules()列出所有当前规则。然后rule.rule应该为您提供URI表达式,rule.methods为您提供可用方法的集合。

然而,AFAIK,你不能为蓝图做到这一点,或者通过他们过滤。蓝图存储了在注册时要调用的lambda函数包含的路由,并且没有简单的方法来解开它。如果你需要这样做,那么继承Blueprint可能是一个更好的主意,重新定义路由方法并在Blueprint实例本身中保留你想要的参数。

答案 2 :(得分:0)

我也希望找到蓝图的端点。我想出了这个片段:

def rules_for_blueprint(bp):
if bp._got_registered_once:
    return [rule for rule in app.url_map.iter_rules() if rule.endpoint.split('.')[0]==bp.name]
else:
    raise Exception("Blueprint routes only exist after blueprint is registered")

只有在蓝图已经注册后才会有效,但对于我的用例来说已经足够了,我相信它也会为其他人派上用场。

相关问题