Flask-RESTful構建小型REST服務

Flask-RESTful構建小型REST服務

2015年6月18日 by debugo  · Leave a comment html

REST是web services和APIs的標準架構,不少APP的架構基本上是使用RESTful的形式了。諸如docker daemon等服務都是提供了RESTful API,docker的CLI能夠經過該API的URL地址與之通訊。
Flask是一個超級流行的Python 編寫的輕量級 Web 應用框架。而Flask有一個REST插件——Flask-RESTful是爲了快速構建REST API的Flask插件,它能和現有的ORM配合實現輕量級數據抽象。Flask-RESTful鼓勵小型化實踐,很是簡單易學。本文將會使用 python的Flask框架輕鬆實現一個RESTful的服務。
REST的六個特性:python

  • Client-Server:服務器端與客戶端分離。web

  • Stateless:每次客戶端請求必需包含完整的信息,換句話說,每一次請求都是獨立的。docker

  • Cacheable(可緩存):服務器端必需指定哪些請求是能夠緩存的。shell

  • Layered System(分層結構):服務器端與客戶端通信必需標準化,服務器的變動並不會影響客戶端。flask

  • Uniform Interface(統一接口):客戶端與服務器端的通信方法必需是統一的。api

  • Code on demand(按需執行代碼):服務器端能夠在上下文中執行代碼緩存

萬事從Hello world起,
安裝Flask-RESTful:
服務器

pip install FLASK-RESTful
#-*- coding: utf-8 -*- from flask 
import Flask from flask.ext 
import restful 
app = Flask(__name__) 
api = restful.Api(app) 

class HelloWorld(restful.Resource):
 def get(self): 
     return {'hello': 'world'} 

     api.add_resource(HelloWorld, '/') 

if __name__ == '__main__': 
    app.run(debug=True)

相比普通的http服務,區別在於:
1. import了RESTful的模塊,並使用了restful Api。
2. REST資源類Hello world必須繼承自restful.Resource,並實現/重寫父類的一些方法(好比get)
3. 將Hello world添加到Restful api資源裏,並無使用裝飾器。
下面是一個更復雜的實現,實現一個item列表的更新。HTTP中有相應的請求方法能夠用於描述操做資源的動做:restful

HTTP方法 動做 例子 功能
GET 獲取資源信息 http://example.com/api/orders 檢索訂單清單
GET 獲取資源信息 http://example.com/api/orders/123 檢索訂單123
POST 建立一個次的資源 http://example.com/api/orders 使用帶數據的請求,建立一個新的訂單
PUT 更新一個資源 http://example.com/api/orders/123 (使用帶數據的請求,更新123訂單)
DELETE 刪除一個資源 http://example.com/api/orders/123 刪除訂單123

下面咱們設計一個複雜的REST API:

#!/usr/bin/env python # -*- coding: utf-8 -*- from flask import Flask from flask.ext.restful import reqparse, Api, Resource, fields, marshal_with from pymongo import MongoClient mongo_url = 'your-ip' db_name = 'your-db' col_name = 'your-col' client = MongoClient(mongo_url) col = client[db_name][col_name] col.remove({}) col.insert({'_id': 1, "name": "debugo", "values": [70, 65]}) col.insert({'_id': 2, "name": "leo", "values": [65]}) app = Flask(__name__) api = Api(app) parser = reqparse.RequestParser() parser.add_argument('name', type=str, required=True) parser.add_argument('values', type=int, help='rate is a number', action='append') class UserInfo(Resource):    def get(self):        return [str(i) for i in col.find({})]    def post(self):        args = parser.parse_args()        user_id = col.count() + 1        col.insert({'_id': user_id, "name": args["name"], "values": args["values"]})        return [str(i) for i in col.find({'_id': user_id})], 201 api.add_resource(UserInfo, '/') if __name__ == '__main__':    app.run(debug=True)

其中咱們定義了一個參數

新建一個請求解析器RequestParser,規定類型爲type,不然會拒絕並提示help的信息:

param type: The type to which the request argument should be
     converted. If a type raises an exception, the message in the
     error will be returned in the response. Defaults to :class:unicode
     in python2 and :class:str in python3.
 param help: A brief description of the argument, returned in the
     response when the argument is invalid with the name of the argument and
     the message passed to any exception raised by a type converter.

在Chrome中使用Advanced REST Client這個應用來測試:

1
2

程序中成功輸出下面請求結果:

127.0.0.1 – – [18/Jun/2015 18:09:23] 「POST / HTTP/1.1″ 201 –
    127.0.0.1 – – [18/Jun/2015 18:09:29] 「GET / HTTP/1.1″ 200 –

###參考:
Flask-RESTful Document
使用python的Flask實現一個RESTful API服務器端
極客學院 Flask-RESTful 插件介紹及應用

相關文章
相關標籤/搜索