【问题标题】:Why does Flask-RESTful' add_resource() has a parameter for URLs and another one for endpoints?为什么 Flask-RESTful 的 add_resource() 有一个用于 URL 的参数和另一个用于端点的参数?
【发布时间】:2022-02-04 16:38:21
【问题描述】:

我正在使用 Flask 和 Flask-RESTful 扩展开发一个 API。我正在创建我的端点和资源,但我对资源“url”和它的“端点”之间的区别感到困惑。据我了解,URL 本身 端点。我也在阅读answers to this StackOverflow question,他们还建议 URL 是一个端点。

然而the Flask-RESTful docs 提到add_resource 方法有一个URL 参数,它 可以接收端点名称。他们甚至提供了这个例子:

api.add_resource(HelloWorld, '/', '/hello')
api.add_resource(Foo, '/foo', endpoint="foo")
api.add_resource(FooSpecial, '/special/foo', endpoint="foo")

我了解他们在做什么,但我还是不明白端点名称的作用。

URL 和端点名称有什么区别?为什么要设置端点名称?

【问题讨论】:

    标签: python flask api-design endpoint flask-restful


    【解决方案1】:

    来自documentation

    网址

    一个或多个与资源匹配的 url 路由,标准烧瓶 路由规则适用。任何 url 变量都将传递给资源 方法作为参数。

    端点

    端点名称(默认为 Resource.name.lower() 可用于 在 fields.Url 字段中引用此路由

    endpoint参数在你打算管理同一个类的两个或多个url时必须指定,其实考虑如下代码sn-p:

    from flask import Flask, request
    from flask_restful import Api, Resource
        
        
    class my_handler(Resource):
        def get(self):
            return request.base_url
            
    app = Flask(__name__)
    api = Api(app)
            
    api.add_resource(my_handler, '/')
    api.add_resource(my_handler, '/hello')
            
    if __name__ == '__main__':
        app.run(host="0.0.0.0", port=5000)
    
    

    flask 将无法执行应用程序,引发异常:

    Exception has occurred: AssertionError       
    View function mapping is overwriting an existing endpoint function: my_handler
    

    为了让flask能够处理同一个类的多个url,你需要指定endpoint参数:

    from flask import Flask, request
    from flask_restful import Api, Resource
    
    
    class my_handler(Resource):
        def get(self):
            return request.base_url
    
    app = Flask(__name__)
    api = Api(app)
    
    api.add_resource(my_handler, '/', endpoint='/')
    api.add_resource(my_handler, '/hello', endpoint='/hello')
    
    if __name__ == '__main__':
        app.run(host="0.0.0.0", port=5000)
    

    通过 http 调用,服务器通过返回请求资源的 url 来响应:

    curl --location --request GET http://127.0.0.1:5000/
    "http://127.0.0.1:5000/"
    
    curl --location --request GET http://127.0.0.1:5000/hello
    "http://127.0.0.1:5000/hello"
    

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 1970-01-01
      • 2013-05-20
      • 2022-07-26
      • 1970-01-01
      • 2018-11-13
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多