0

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

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/method。动词很重要,因为没有它,链接是不完整/无用的。

4

3 回答 3

1

马克,

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

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

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

需要明确的是,您不能在 url 本身中对该方法进行编码。客户端必须从不同的字段读取方法并适当地调用 url。网址只是位置和运输。

于 2014-06-04T01:00:53.113 回答
0

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

但是,AFAIK,您不能为蓝图这样做,也不能按它们过滤。蓝图存储了封装在 lambda 函数中的路由,以便在注册时调用,并且没有简单的方法可以解开它。如果您需要这样做,最好将蓝图子类化,重新定义路由方法并在蓝图实例本身中保留您想要的参数。

于 2014-06-04T17:38:45.260 回答
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")

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

于 2015-08-02T15:01:10.303 回答