“ 近些年来 REST (REpresentational State Transfer) 已经变成了 web services 和 web APIs 的标配。接下来我将展示如何用Flask 框架来创建一个 RESTful 的 web service”
01
—
什么是基于RESTful 的 web service
REST 架构的最初目的是适应万维网的 HTTP 协议。REST是什么请参考我之前的文章《IoT网络协议-CoAP》RESTful web services 概念的核心就是“资源”。资源可以用 URI 来表示。客户端使用 HTTP 协议定义的方法来发送请求到这些 URIs,当然可能会导致这些被访问的”资源“状态的改变。
HTTP 标准的方法有如下:
========== ===================== ==================================
HTTP 方法 行为 示例
========== ===================== ==================================
GET 获取资源的信息 http://example.com/api/orders
GET 获取某个特定资源的信息 http://example.com/api/orders/123
POST 创建新资源 http://example.com/api/orders
PUT 更新资源 http://example.com/api/orders/123
DELETE 删除资源 http://example.com/api/orders/123
========== ====================== =================================
REST 设计不需要特定的数据格式。在请求中数据可以以 JSON 形式, 或者有时候作为 url 中查询参数项。
02
—
使用Flask实现RESTful services
Flask 为 RESTful APIs 提供了一种简易的实现方式,可以针对不同的HTTP方法提供不同的函数。使用也很简单,只需要继承 flask.views.MethodView 然后重写需要的方法:GET POST PUT 等。
class DeviceEditView(MethodView):
def get(self,id=None):
categories = ProtocolList.query.all()
item = DeviceList.query.filter(DeviceList.n_id == id).all()
......
return render_template('edit.html', categories=categories, item=item[0])
def post(self,id):
device = DeviceList.query.filter(DeviceList.n_id == id).all()[0]
......
return redirect(url_for('device.device_list'))
device.add_url_rule('/edit/<int:id>',view_func=DeviceEditView.as_view('device_edit'))
最下面的add_url_rule是添加路由函数,和装饰器是一个效果
@app.route('/')
def index():
return render_template('login.html')
我们已经完成了我们 web service 的大部分功能,但是仍然有一个问题。我们的 web service 对任何人都是公开的,这并不是一个好主意。
我们有一个可以管理我们的待办事项完整的 web service,但在当前状态下的 web service 是开放给所有的客户端。如果一个陌生人弄清我们的 API 是如何工作的,他或她可以编写一个客户端访问我们的 web service 并且毁坏我们的数据。大部分初级的教程会忽略这个问题并且到此为止。
在我看来这是一个很严重的问题,我必须指出。确保我们的 web service 安全服务的最简单的方法是要求客户端提供一个用户名和密码。在常规的 web 应用程序会提供一个登录的表单用来认证,并