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 和端点名称有什么区别?为什么我要设置端点名称?
从文档中:
网址
一个或多个 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)
| 归档时间: |
|
| 查看次数: |
3500 次 |
| 最近记录: |