英语原文共 29 页,剩余内容已隐藏,支付完成后下载完整资料
文献:Flask Framework CookBook
第七章 RESTful API 搭建
API或应用程序编程接口可以概括为开发人员的申请界面。就像终端用户有一个端与应用程序交互的界面。开发者也需要一个用户界面访问应用程序。REST或REpresentational State Transfer,不是协议或标准。它只是一个为编写应用程序而定义的体系结构样式软件或一组约束简化应用程序内外的接口。当Web服务API是以遵循REST约束的方式编写,它们就被称为RESTful API。RESTful使API与内部应用程序细节分离。这使得易于拓展并维持事情简单。统一的接口确保每个请求都有记录。
注意:REST和SOAP谁更好是一个争论的话题它实际上是一个主观问题,因为它取决于需要做什么。每个人都有自己的利益,应根据应用程序的需要进行选择。
在本章中,我们将介绍以下板块:
1创建基于类的REST接口
2.创建基于扩展的REST接口
3创建基于SQLAlchemy的REST API
4一个完整的REST API示例
介绍
顾名思义,REpresentational State Transfer(REST)要求隔离您的API与逻辑资源,
这可以通过HTTP请求实现访问和操作,其中每个请求都包含一个GET,POST,PUT,PATCH和DELETE之外的方法(可以有更多方法,但这些是最常用的)。这些方法中的每一种方法都具有特定含义。REST的一个关键隐含原则是资源的逻辑分组应该是容易理解,因此提供简单性和便携性。
到目前为止,在本书中,我们使用了一种名为Product的资源。让我们看看我们怎么做逻辑上将我们的API调用映射到资源隔离:
GET /products/1: This gets the product with ID 1
GET /products: This gets the list of products
POST /products: This creates a new product
PUT /products/1: This updates the product with ID 1
PATCH /products/1: This partially updates the product with ID 1
DELETE /products/1: This deletes the product with ID 1
第一节创建基于类的REST接口
我们看到了基于类的视图如何在Flask中使用在第4章“使用视图”中基于类的视图的工作过程。我们现在将看到我们如何做到使用相同的概念创建视图,这将为我们的应用程序提供REST接口。
准备
让我们看一个简单的视图,它将处理对我们的Product模型的REST样式调用。
操作步骤
我们必须简单地修改我们的产品处理视图以扩展MethodView类:
from flask.views import MethodView
class ProductView(MethodView):
def get(self, id=None, page=1):
if not id:
products = Product.query.paginate(page, 10).items
res = {}
for product in products:
res[product.id] = {
#39;name#39;: product.name,
#39;price#39;: product.price,
#39;category#39;: product.category.name
}
else:
product = Product.query.filter_by(id=id).first()
if not product:
abort(404)
res = json.dumps({
#39;name#39;: product.name,
#39;price#39;: product.price,
#39;category#39;: product.category.name
})
return res
前面的get()搜索产品并发回JSON结果。同样,我们也可以编写post(),put()和delete()方法:
def post(self):
# Create a new product.
# Return the ID/object of newly created product.
return
def put(self, id):
# Update the product corresponding provided id.
# Return the JSON corresponding updated product.
return
def delete(self, id):
# Delete the product corresponding provided id.
# Return success or error message.
return
我们中的许多人都想知道为什么我们这里没有路由。要包括路由,我们必须这样做如下所示:
product_view = ProductView.as_view(#39;product_view#39;)
app.add_url_rule(#39;/products/#39;, view_func=product_view,
methods=[#39;GET#39;, #39;POST#39;])
app.add_url_rule(#39;/products/lt;int:idgt;#39;, view_func=product_view,
methods=[#39;GET#39;, #39;PUT#39;, #39;DELETE#39;])
这里的第一个语句将类转换为内部的实际视图函数与路由系统一起使用。接下来的两个语句是可以进行的通话的对应的URL规则。
执行过程
MethodView类标识了发送的HTTP请求和转换HTTP方法的类型名称为小写的方法。
然后,它将它与类中定义的方法相匹配并调用匹配的方法。 因此,如果我们对ProductView进行GET调用,它将自动生成映射到get()方法并进行相应处理。
更多
我们也可以使用Flask扩展名为Flask-Classy(https:// pythonhosted.org/Flask-Classy/).这将自动处理类和路由到一个深远程度,使得生活更轻松。我们不会在这里讨论这个,但它是一个绝对值得探索的拓展。
第二节创建基于扩展的REST接口
在上一个小节,创建了基于类的REST接口,我们看到了如何创建一个使用可插入视图的REST接口。在这里,我们将使用Flask扩展,Flask-Restless,从构建REST接口的角度完全开发。它提供了一个简单的为用SQLAlchemy定义的数据库模型生成RESTful API。这些产生了以JSON格式发送和接收消息的APIs
准备
首先,我们需要安装Flask-Restless扩展:
$ pip install Flask-Restless
我们借用第四章的程序构建我们的应用,以此来包含RESTful API接口。
注意:如果views和handlers的概念不是很清楚,建议在继续阅读之前,先去阅读第四章。
操作步骤
通过使用RESTful API,可以非常轻松地将RESTful API接口添加到SQLAlchemy模型中。首先,我们需要添加提供的REST API管理器扩展到我们的应用程序配置并使用app对象创建它的实例:
from flask.ext.restless import APIManager
manager = APIManager(app, flask_sqlalchemy_db=db)
在此之后,我们需要使用管理器实例在我们的模型上启用API创建。为此,我们可以将以下代码行添加到views.py:
from my_app import manager
manager.create_api(Product, methods=[#39;GET#39;, #39;POST#39;, #39;DELETE#39;])
manager.create_api(Category, methods=[#39;GET#39;, #39;POST#39;, #39;DELETE#39;])
这将在我们的产品和类别模型上使用GET,POST和DELETE方法创建RESTful API。
默认情况下,如果methods参数缺失的话,只支持GET方法。
执行过程
要测试并查看其工作原理,我们可以使用Python shell发送一些请求到:
gt;gt;gt; import requests
gt;gt;gt; import json
gt;gt;gt; res = requests.get('http://127.0.0.1:5000/api/category')
gt;gt;gt; res.json()
{u#39;total_pages#39;: 0, u#39;objects#39;: [], u#39;num_results#39;: 0, u#39;page#39;: 1}
我们提出了一个获取类别列表的GET请求,但是现在没有记录。我们现在来寻找产品:
gt;gt;gt; res = requests.get(#39;http://127.0.0.1:5000/api/product#39;)
gt;gt;gt; res.json()
{u#39;total_pages#39;: 0, u#39;objects#39;: [], u#39;num_results#39;: 0, u#39;page#39;: 1}
我们提出了获取产品列表的GET请求,但没有记录。 让我们创建一个新产品现在:
gt;gt;gt; d = {#39;name#39;: u#39;iPhone#39;, #39;price#39;: 549.00, #39;category#39;:{#39;name#39;:#39;Phones#39;}}
gt;gt;gt; res = requests.post(#39;http://127.0.0.1:5000/api/product#39;, data=json.dumps(d), headers={#39;Content-Type#39;: #39;application/json#39;})
gt;gt;gt; res.json()
{u#39;category#39;: {u#39;id#39;: 1, u#39;name#39;: u#39;Phones#39;}, u#39;name#39;: u#39;iPhone#39;,
u#39;company#39;: u#39;#39;, u#39;price#39;: 549.0, u#39;category_id#39;: 1, u#39;id#39;: 2, u#39;image_path#39;: u#39;#39;}
我们发送了一个POST请求来创建包含一些数据的产品。注意在请求中的headers参数。在Flask-Restless中发送的每个POST请求都应该有这个。现在我们应该再次查找产品列表:
gt;gt;gt; res = requests.get(#39;http://127.0.0.1:5000/api/product#39;)
gt;gt;gt; res.json()
{u#39;total_pages#39;: 1, u#39;objects#39;: [{u#39;category#39;: {u#39;id#39;: 1, u#39;name#39;: u#39;Phones#39;}, u#39;name#39;: u#39;iPhone#39;, u#39;company#39;: u#39;#39;, u#39;price#39;: 549.0, u#39;category_id#39;: 1, u#39;id#39;: 1, u#39;image_path#39;: u#39;#39;}], u#39;num_results#39;: 1, u#39;page#39;: 1}
如果我们通过GET请求再次查找产品,我们可以看到我们新创建了现在数据库中的产品。
另请注意,默认情况下查询结果已经分页; 这是一个好的迹象之一API设计。
更多
这种自动创建RESTful API接口非常的酷,但每个应用程序都需要一些根据应用程序业务逻辑进行的自定义,验证和请求处理。使用请求预处理器和后处理器可以实现这一点。从名字可以看出,预处理器会在请求被处理前运行,后处理器会在请求处理完,发送给应用前运行。它们被定义在create_api()中,做为请求类型(GET,POST等)映射,并且作为前处理程序或后处理程序的方法列表,用于处理指定的请求:
manager.create_api(
lt;
全文共22393字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[1624]
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。