烧瓶绑定资源到端点
flask binding resource to an endpoint
据我所知,目前有两种使用 Flask 框架将资源绑定到端点的方法,
第一个是使用 @app.route
装饰器,像这样:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
第二种方法是在flask-restfull中创建一个继承自Resources
的class,这个class包含http方法作为函数,我们将它绑定到一个端点使用add_resource
方法,如下:
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return 'Hello, World!'
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run()
据我所知,这两种不同的语法做同样的事情,但我不明白这两者之间有什么区别?或者一个是为特定类型的应用程序设计的,另一个是为另一种类型的应用程序设计的?
Flask-RESTful 是 Flask 的扩展,它本身建立在 Werkzeug 提供的许多优秀实用程序之上。
from flask import Flask
app = Flask(__name__)
@app.route('/foo')
def say_foo():
return 'foo'
@app.route('/bar')
def say_bar():
return 'bar'
if __name__ == '__main__':
app.run()
REST 背后最重要的想法之一是使用 HTTP 与资源进行交互。这段代码的问题是我们的资源被分割成多个方法。没有封装。虽然 API 本身包含了 REST 的基本元素,但代码完全没有捕捉到这些想法。这是不好的!我们的内部代码没有理由不匹配 API.
的外观
使用 Flask-RESTful
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class Foo(Resource):
def get(self):
return 'foo'
class Bar(Resource)
def get(self):
return 'bar'
# As you might have guessed, these two lines add a given resource to our API at the
# specified route. We no longer need to enumerate what methods a route supports,
# since Flask-RESTful resolves this information by inspecting what methods you've
# defined on your resource object.
api.add_resource(Foo, '/foo')
api.add_resource(Bar, '/bar')
if __name__ == '__main__':
app.run()
我们现在有 class 个!这是一件大事。我们的路线现在直接映射到对象。更好的是,给定 class 上的方法与其对应的 HTTP 方法完全相同。我们不再需要像 say_foo
那样在路由上处理命名方法,因为 HTTP 方法和 classes 上的方法之间存在一对一的映射。
据我所知,目前有两种使用 Flask 框架将资源绑定到端点的方法,
第一个是使用 @app.route
装饰器,像这样:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
第二种方法是在flask-restfull中创建一个继承自Resources
的class,这个class包含http方法作为函数,我们将它绑定到一个端点使用add_resource
方法,如下:
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return 'Hello, World!'
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run()
据我所知,这两种不同的语法做同样的事情,但我不明白这两者之间有什么区别?或者一个是为特定类型的应用程序设计的,另一个是为另一种类型的应用程序设计的?
Flask-RESTful 是 Flask 的扩展,它本身建立在 Werkzeug 提供的许多优秀实用程序之上。
from flask import Flask
app = Flask(__name__)
@app.route('/foo')
def say_foo():
return 'foo'
@app.route('/bar')
def say_bar():
return 'bar'
if __name__ == '__main__':
app.run()
REST 背后最重要的想法之一是使用 HTTP 与资源进行交互。这段代码的问题是我们的资源被分割成多个方法。没有封装。虽然 API 本身包含了 REST 的基本元素,但代码完全没有捕捉到这些想法。这是不好的!我们的内部代码没有理由不匹配 API.
的外观使用 Flask-RESTful
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class Foo(Resource):
def get(self):
return 'foo'
class Bar(Resource)
def get(self):
return 'bar'
# As you might have guessed, these two lines add a given resource to our API at the
# specified route. We no longer need to enumerate what methods a route supports,
# since Flask-RESTful resolves this information by inspecting what methods you've
# defined on your resource object.
api.add_resource(Foo, '/foo')
api.add_resource(Bar, '/bar')
if __name__ == '__main__':
app.run()
我们现在有 class 个!这是一件大事。我们的路线现在直接映射到对象。更好的是,给定 class 上的方法与其对应的 HTTP 方法完全相同。我们不再需要像 say_foo
那样在路由上处理命名方法,因为 HTTP 方法和 classes 上的方法之间存在一对一的映射。