为什么 Flask-RESTful 的 add_resource() 有一个用于 URL 的参数和另一个用于端点的参数?

Lep*_*666 3 python api-design endpoint flask flask-restful

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

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

api.add_resource(HelloWorld, '/', '/hello')
api.add_resource(Foo, '/foo', endpoint="foo")
api.add_resource(FooSpecial, '/special/foo', endpoint="foo")
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*ini 5

文档中:

网址

一个或多个 url 路由来匹配资源,标准 Flask 路由规则适用。任何 url 变量都将作为 args 传递给资源方法。

端点

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

当你打算管理同一个类的两个或多个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, '/')
api.add_resource(my_handler, '/hello')
        
if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000)

Run Code Online (Sandbox Code Playgroud)

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

Exception has occurred: AssertionError       
View function mapping is overwriting an existing endpoint function: my_handler
Run Code Online (Sandbox Code Playgroud)

为了让 Flask 处理具有相同类的多个 url,您需要指定端点参数:

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)
Run Code Online (Sandbox Code Playgroud)

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

curl --location --request GET http://127.0.0.1:5000/
"http://127.0.0.1:5000/"
Run Code Online (Sandbox Code Playgroud)
curl --location --request GET http://127.0.0.1:5000/hello
"http://127.0.0.1:5000/hello"
Run Code Online (Sandbox Code Playgroud)