迅速に起動する¶
始めを急ぎますか。このページはイブの初めての紹介です。
最小アプリケーション¶
最小のEVEアプリケーションを以下に示す.
from eve import Eve
app = Eve()
if __name__ == '__main__':
app.run()
これを別にrun.pyに保存すればよい.次に、以下を含む新しいテキストファイルを作成します。
DOMAIN = {'people': {}}
これをsettings.pyとして別に格納し,run.pyを格納するディレクトリと同じである.これはイヴプロファイル、標準的なPythonモジュールで、イヴにあなたのAPIには1つのアクセス可能なリソースしか含まれていないことを教えてくれます。 people
それがそうです。
今はAPIを起動することができます。
$ python run.py
* Running on http://127.0.0.1:5000/
このインタフェースを使用することができます
$ curl -i http://127.0.0.1:5000
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 82
Server: Eve/0.0.5-dev Werkzeug/0.8.3 Python/2.7.3
Date: Wed, 27 Mar 2013 16:06:44 GMT
おめでとうございます。あなたのGET要求に良い応答を得ました。ペイロードを見てみましょう
{
"_links": {
"child": [
{
"href": "people",
"title": "people"
}
]
}
}
API入口ポイント準拠 HATEOAS 原理は、APIを介してアクセス可能なリソースに関する情報を提供する。私たちの例では1つのサブリソースしか利用できません people
それがそうです。
お願いしようとしています people
今:
$ curl http://127.0.0.1:5000/people
{
"_items": [],
"_links": {
"self": {
"href": "people",
"title": "people"
},
"parent": {
"href": "/",
"title": "home"
}
},
"_meta": {
"max_results": 25,
"page": 1,
"total": 0
}
}
今回は1つを手に入れました _items
リストです。♪the _links
アクセスされた資源に対するものであるため,親資源(ホームページ)と資源自体へのリンクを得ることができる.Pymongoからデッドラインミスを受け取ったら、前提条件を満たすことを確認してください。可能なことは mongod
サーバプロセスは実行されていない.
デフォルトの場合、イヴAPIは読み取り専用である:
$ 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ではデータベースの詳細は提供されていないのでイヴは people
(存在しない可能性さえある)セットは、APIユーザを失望させたくないので、空のリソースにシームレスにサービスを提供する。
データベース挿入歌¶
Settings.pyに以下の行を追加することでデータベースに接続しましょう。
# Let's just use the local mongod instance. Edit as needed.
# Please note that MONGO_HOST and MONGO_PORT could very well be left
# out as they already default to a bare bones local 'mongod' instance.
MONGO_HOST = 'localhost'
MONGO_PORT = 27017
# Skip this block if your db has no auth. But it really should.
MONGO_USERNAME = '<your username>'
MONGO_PASSWORD = '<your password>'
# Name of the database on which the user can be authenticated,
# needed if --auth mode is enabled.
MONGO_AUTH_SOURCE = '<dbname>'
MONGO_DBNAME = 'apitest'
MongoDBは 怠ける 実際にデータベースセットを作成する必要はありません実際にはデータベースを作成する必要もありません空/存在しないデータベース上のGET要求を正しく処理する (200 OK
空集合);DELETE/PATCH/PUTは適切な応答を受信します。 (404 Not Found
)、POST要求は、必要に応じてデータベースおよびセットを作成する。しかし,このような自動管理データベースの性能は,インデックスや任意のタイプの最適化が不足しているため非常に悪い.
より複雑なアプリケーションは¶
今まで、私たちのAPIは読むだけでした。すべてのCRUD操作を有効にしましょう:
# Enable reads (GET), inserts (POST) and DELETE for resources/collections
# (if you omit this line, the API will default to ['GET'] and provide
# read-only access to the endpoint).
RESOURCE_METHODS = ['GET', 'POST', 'DELETE']
# Enable reads (GET), edits (PATCH), replacements (PUT) and deletes of
# individual items (defaults to read-only item access).
ITEM_METHODS = ['GET', 'PATCH', 'PUT', 'DELETE']
RESOURCE_METHODS
リソースエンドノードが許可する方法を列挙する. (/people
)である。 ITEM_METHODS
エントリの終端で有効にする方法を示す (/people/<ObjectId>
)。この2つの設定はいずれも大域スコープを持ち,すべての端点に適用する.そして、各エンドポイントレベルでHTTPメソッドを有効にまたは無効にすることができ、すぐにこれを見ることができます。
私たちは編集を有効にしたので、私たちはまた正しいデータ検証を有効にしたい。私たちのために people
資源です。
schema = {
# Schema definition, based on Cerberus grammar. Check the Cerberus project
# (https://github.com/pyeve/cerberus) for details.
'firstname': {
'type': 'string',
'minlength': 1,
'maxlength': 10,
},
'lastname': {
'type': 'string',
'minlength': 1,
'maxlength': 15,
'required': True,
# talk about hard constraints! For the purpose of the demo
# 'lastname' is an API entry-point, so we need it to be unique.
'unique': True,
},
# 'role' is a list, and can only contain values from 'allowed'.
'role': {
'type': 'list',
'allowed': ["author", "contributor", "copy"],
},
# An embedded 'strongly-typed' dictionary.
'location': {
'type': 'dict',
'schema': {
'address': {'type': 'string'},
'city': {'type': 'string'}
},
},
'born': {
'type': 'datetime',
},
}
検証に関するより多くの情報は、参照されたい データ検証 それがそうです。
さらにカスタマイズしたいと仮定してみましょう people
端点.私たちはこう望んでいます
プロジェクトタイトルを設定する
person
追加の custom item endpoint はい。
/people/<lastname>
デフォルト設定を上書きする cache control directives
削除を無効にする
/people
端末(私たちは全体的に有効にしました)
以下はどのように完成しますか people
定義は私たちが更新したsettings.pyファイルで検索します。
people = {
# 'title' tag used in item links. Defaults to the resource title minus
# the final, plural 's' (works fine in most cases but not for 'people')
'item_title': 'person',
# by default the standard item entry point is defined as
# '/people/<ObjectId>'. We leave it untouched, and we also enable an
# additional read-only entry point. This way consumers can also perform
# GET requests at '/people/<lastname>'.
'additional_lookup': {
'url': 'regex("[\w]+")',
'field': 'lastname'
},
# We choose to override global cache-control directives for this resource.
'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,
}
Settings.pyを保存し、runn.pyを起動します。私たちは文書を挿入することができます people
端点:
$ curl -d '[{"firstname": "barack", "lastname": "obama"}, {"firstname": "mitt", "lastname": "romney"}]' -H 'Content-Type: application/json' http://127.0.0.1:5000/people
HTTP/1.0 201 OK
私たちはまたプロジェクトを更新して削除することができます(しかし、それを無効にしているので、リソース全体を更新して削除することはできません)。新しいものにも lastname
端点:
$ curl -i http://127.0.0.1:5000/people/obama
HTTP/1.0 200 OK
Etag: 28995829ee85d69c4c18d597a0f68ae606a266cc
Last-Modified: Wed, 21 Nov 2012 16:04:56 GMT
Cache-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"}
}
}
キャッシュ命令とプロジェクトタイトルは、私たちの新しい設定と一致します。見 機能 利用可能な機能の完全なリストおよびより多くの使用例については、参照されたい。