python RESTful API架構:Eve 高速入門

來源:互聯網
上載者:User

標籤:完整   number   track   ons   test   item   csdn   set   刪除   

Eve是一款Python的REST API架構。用於公布高可定製的、全功能的RESTful的Web服務。幫你輕鬆建立和部署API,本文翻譯自Eve官方網站:
http://python-eve.org/quickstart.html#database-interlude

Eve 高速入門:
渴望開始嗎?這個頁面將提供Eve一個非常好的介紹。在這之前假設:
你已經安裝好了Eve。

假設你還沒有,能夠點擊到安裝頁面。
已經安裝了MongoDB。
而且MongoDB 已經運行了。


一個最小的應用
一個最小的Eve應用。看起來是這種:

from eve import Eveapp = Eve()if __name__ == ‘__main__‘:    app.run()

然後儲存為run.py,接著建立一個新的文檔包括已經內容:

DOMAIN = {‘people‘: {}}

接著儲存為settings.py。而且放在run.py同樣的目錄下。
這是Eve的設定檔,一個標準的python模組,這個檔案告訴了Eve你的API包括了一個可訪問的資源。people。

如今你已經準備好啟動你的API了。

$ python run.py * Running on http://127.0.0.1:5000/

如今你已經能夠使用這個API了:

$ curl -i http://127.0.0.1:5000HTTP/1.0 200 OKContent-Type: application/jsonContent-Length: 82Server: Eve/0.0.5-dev Werkzeug/0.8.3 Python/2.7.3Date: Wed, 27 Mar 2013 16:06:44 GMT

恭喜。你的GET請求已經得到了一個非常好的響應返回。讓我們看看這個承載:

{    "_links": {        "child": [            {                "href": "people",                "title": "people"            }        ]    }}

API存取點遵循著HATEOAS(超媒體即狀態應用引擎)原則和規定API資源訪問資訊,在我們的範例中僅僅提供了一個可用child的資源,這裡是people。

如今嘗試請求people:

$ curl http://127.0.0.1:5000/people
{    "_items": [],    "_links": {        "self": {            "href": "people",            "title": "people"        },        "parent": {            "href": "/",            "title": "home"        }    }}

這次我們也得到了一個_items 表,_links 相對於是被訪問的資源,所以你得到了父資源連結(首頁)和資源本身。

預設情況下Eve 的APIs是僅僅讀的:

$ curl -X DELETE http://127.0.0.1:5000/people<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><title>405 Method Not Allowed</title><h1>Method Not Allowed</h1><p>The method DELETE is not allowed for the requested URL.</p>

這是由於我們還沒有在settings.py中規定不論什麼的資料庫細節,所以Eve會在無法索引到不論什麼people表實際的內容(甚至可能不存在)時無縫得提供一個空的資源。由於我們不想讓API的使用者down(不知道譯成什麼好…)。
插入資料庫
讓我們通過添加以下幾行到setting.py來串連資料庫:

# 依據編輯須要,讓我們使用本地mongod執行個體# 須要注意的是MONGO_HOST 和 MONGO_PORT非常有可能會無效。由於預設存在本地系統的值。MONGO_HOST = ‘localhost‘MONGO_PORT = 27017MONGO_USERNAME = ‘user‘MONGO_PASSWORD = ‘user‘MONGO_DBNAME = ‘apitest‘

由於MongoDB便捷性,我們不須要真正得去建立資料表。實際上我們甚至不須要建立資料庫:GET 請求空的或不存在的資料庫是會返回正確(200 OK會得到一個空集合(表));DELETE/PATCH/PUT會得到適當的響應(404 Not Found),POST請求會建立所需的資料庫或表。

然而這種自己主動管理的資料庫會運行得非常差,由於缺少了索引和不論什麼形式的最佳化。


一個更複雜的應用
到眼下為止我們的API都是僅僅讀的。讓我們能夠全面得進行CRUD(添加(Create)、讀取(Retrieve)(又一次得到資料)、更新(Update)和刪除(Delete))運作:

# 授權資源、資料庫  讀 (GET), 插入 (POST) and 刪除 DELETE# (假設你省略這行, API將預設是 [‘GET‘] 和 提供僅僅讀許可權訪問端點).# RESOURCE資源。METHODS方法RESOURCE_METHODS = [‘GET‘, ‘POST‘, ‘DELETE‘]# 同意 讀 (GET), 編輯 (PATCH), 替換 (PUT) 和刪除 個人項目 items  (預設訪問項目是僅僅讀).# ITEM 項目ITEM_METHODS = [‘GET‘, ‘PATCH‘, ‘PUT‘, ‘DELETE‘]

當ITEM_METHODS 列表中的方法授權給項目端點(/people/)時RESOURCE_METHODS表中的方法才授權資源端點(/people)。

都設定則會有一個全域範圍並使全部的端點都有效。然而你也能夠啟用或者禁用單個端點的HTTP方法等級。我們非常快就能看到。


由於我們同意了編輯了,我們也希望讓資料能夠進行合適驗證。

讓我們為people資源定義一種模式。

schema = {  # 模式定義, 基於 Cerberus 文法. 核實 Cerberus 項目細節在    # (https://github.com/nicolaiarocci/cerberus)。    ‘firstname‘: {        ‘type‘: ‘string‘,        ‘minlength‘: 1,        ‘maxlength‘: 10,    },    ‘lastname‘: {        ‘type‘: ‘string‘,        ‘minlength‘: 1,        ‘maxlength‘: 15,        ‘required‘: True,        # 這個DEMO的目的是討論硬約束        # ‘lastname‘ 是一個 API 條目標記, 所以我們須要它獨一無二。        ‘unique‘: True,    },    # ‘role‘ 是一張表。和僅僅能是allowed中的值    ‘role‘: {        ‘type‘: ‘list‘,        ‘allowed‘: ["author", "contributor", "copy"],    },        # 一種嵌入式固定類型的字典。    ‘location‘: {        ‘type‘: ‘dict‘,        ‘schema‘: {            ‘address‘: {‘type‘: ‘string‘},            ‘city‘: {‘type‘: ‘string‘}        },    },    ‘born‘: {        ‘type‘: ‘datetime‘,    },}

很多其它的資訊驗證請看 資料有效性。

如今讓我們討論下我們想進一步定製端點的people。我們想:
設定一項的標題為person
添加一個額外的自己定義項端點在/people/
覆蓋預設緩衝控制指令
禁用people 端點的DELETE(設定全域變數)

這裡是完整得展示setting.py檔案更新中people的定義:

people = {    # ‘title‘用於項目連結。

預設資源標題減去最後 複數 ‘s‘ (在大部分情況下工作正常。而不是‘people’) ‘item_title‘: ‘person‘, # 依據標準項目存取點是定義成‘/people/<ObjectId>‘。 #. 我們讓它不可更改 和我們也啟動一個額外的僅僅讀存取點 。這種方法也能讓消費者運行GET請求‘/people/<lastname>‘。 ‘additional_lookup‘: { ‘url‘: ‘regex("[\w]+")‘, ‘field‘: ‘lastname‘ }, # 我們決定對這個資源覆蓋全域變數緩衝控制準則。

‘cache_control‘: ‘max-age=10,must-revalidate‘, ‘cache_expires‘: 10, # most global settings can be overridden at resource level ‘resource_methods‘: [‘GET‘, ‘POST‘], ‘schema‘: schema}

最後我們更新網域定義:

DOMAIN = {    ‘people‘: people,}

儲存setting.py 和啟動 run.py。

如今我們能夠在people端點插入文檔了:

$ curl -d ‘[{"firstname": "barack", "lastname": "obama"}, {"firstname": "mitt", "lastname": "romney"}]‘ -H ‘Content-Type: application/json‘  http://127.0.0.1:5000/peopleHTTP/1.0 201 OK

我們也能夠更新和刪除項目(但不能是整個資源,由於我們禁用了)。

我們也能夠運行GET請求擷取這個新的lastname端點:

$ curl -i http://127.0.0.1:5000/people/obamaHTTP/1.0 200 OKEtag: 28995829ee85d69c4c18d597a0f68ae606a266ccLast-Modified: Wed, 21 Nov 2012 16:04:56 GMTCache-Control: ‘max-age=10,must-revalidate‘Expires: 10...
{    "firstname": "barack",    "lastname": "obama",    "_id": "50acfba938345b0978fccad7"    "updated": "Wed, 21 Nov 2012 16:04:56 GMT",    "created": "Wed, 21 Nov 2012 16:04:56 GMT",    "_links": {        "self": {"href": "people/50acfba938345b0978fccad7", "title": "person"},        "parent": {"href": "/", "title": "home"},        "collection": {"href": "people", "title": "people"}    }}

緩衝準則和項目標題符合我們新的設定。請看產品特性擷取特性完整列表和很多其它的使用示範範例。

後記:
全部的範例和程式碼片段都來自Live demo。這是一個全功能的API,你能夠使用到自己的實驗和生活執行個體或本地(你也能夠使用執行個體應用來填充或重設資料庫)。

python RESTful API架構:Eve 高速入門

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.