標籤:完整 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 高速入門