繁体   English   中英

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

[英]Why does Flask-RESTful' add_resource() has a parameter for URLs and another one for endpoints?

我正在使用 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")

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

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

文档中:

URL

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

端点

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

当您打算管理具有相同 class 的两个或多个 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, '/')
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 处理具有相同 class 的多个 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)

通过进行 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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM