【问题标题】:methods(http verbs) of all endpoints in current flask blueprint当前烧瓶蓝图中所有端点的方法(http动词)
【发布时间】:2014-06-03 20:35:46
【问题描述】:

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

【问题讨论】:

  • 使用request.url和request.method有什么问题?
  • 我会修正我的回复 - 但要更具体一些。我希望每个端点都返回其他端点。使用“请求”仅给出当前请求,而不是当前蓝图的所有可能请求

标签: rest url http-method flask


【解决方案1】:

马克,

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

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

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

需要明确的是,您不能在 url 本身中对方法进行编码。客户端必须从不同的字段读取方法并适当地调用 url。 url 就是位置和交通工具。

【讨论】:

  • 非常感谢,我会尽量在我的问题中更加明确。虽然 request 确实给出了当前的请求动词和 url,但它没有给出其他可能的请求 urls/verbs。
【解决方案2】:

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

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

【讨论】:

  • 这很好用,在梳理完蓝图后,它可能是唯一的方法
【解决方案3】:

我也想找到蓝图的端点。我想出了这个sn-p:

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")

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

【讨论】:

    猜你喜欢
    • 2016-12-16
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2015-07-16
    相关资源
    最近更新 更多