SlideShare a Scribd company logo
Rest con Python
Lo necesario
Intentar crear un API Rest con Python
Que cumpla con todos los estandares REST
Que sea facil de utilizar y probar
Que sea customizable
Que tenga buena documentacion y soporte
Que utilize y se integre con Mongo facilmente
Lo Necesario
Todo esto en 3 Dias!!!
Introducing!
Introducing Flask!
Flask
Flask
Flask is a microframework for Python based on Werkzeug,
Jinja 2 and good intentions. And before you ask: It's BSD
licensed!
Flask is Fun
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
And Easy to Setup
$ pip install Flask
$ python hello.py
Eve
Python REST API Framework
Powered by Flask, MongoDB, Redis and good
intentions
Eve allows to effortlessly build and deploy
highly customizable, fully featured RESTful
Web Services
Eve is Simple
from eve import Eve
app = Eve()
app.run()
The API is now live, ready to be consumed:
$ curl -i http://example.com/people
HTTP/1.1 200 OK
REST, Flask and MongoDB
REST, Flask and MongoDB supported
Installation
$ pip install eve
$ easy_install eve
Ejemplo
from eve import Eve
app = Eve()
if __name__ == '__main__':
app.run()
Despues creamos un Settings
Creamos un settings.py
DOMAIN = {'people': {}}
Response
{
"_links": {
"child": [
{
"href": "/people",
"title": "people"
}
]
}
}
Now request
$ curl http://127.0.0.1:5000/people
{
"_items": [],
"_links": {
"self": {
"href": "/people",
"title": "people"
},
"parent": {
"href": "",
"title": "home"
}
}
}
HATEOAS
API entry points adhere to the HATEOAS
Hypermedia as the Engine of Application State
(HATEOAS)
HATEOAS
The principle is that a client interacts with a
network application entirely through
hypermedia provided dynamically by
application servers
Database Interlude
# 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
MONGO_USERNAME = 'user'
MONGO_PASSWORD = 'user'
MONGO_DBNAME = 'apitest'
A More Complex Application
So far our API has been read-only. Let’s enable the full spectrum of CRUD operations:
# 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']
Schema
schema = {
# Schema definition, based on Cerberus grammar. Check the Cerberus project
# (https://github.com/nicolaiarocci/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',
},
}
Better Customization
Now let’s say that we want to further customize the people endpoint
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
}
Features
Lots of features!!!
Full range of CRUD
Action HTTP Verb Context
Create POST Collection
Read GET, HEAD Collection/Document
Update PATCH Document
Replace PUT Document
Delete DELETECollection/Document
More info
Field Description
_created item creation date.
_updated item last updated on.
_etag ETag, to be used for concurrency control and
conditional requests.
_id unique item key, also needed to access the
individual item endpoint.
Sub Resources
Endpoints support sub-resources so you could have something like:/people/<contact_id>/invoices
invoices = {
'url': 'people/<regex("[a-f0-9]{24}"):contact_id>/invoices'
Then this GET to the endpoint, which would roughly translate to give me all the invoices by <contact_id>:
Customizable, item endpoints
Resources can or cannot expose individual item endpoints. API consumers could get access to /people,
/people/<ObjectId> and /people/Doe
$ curl -i http://eve-demo.herokuapp.com/people/521d6840c437dc0002d1203c
HTTP/1.1 200 OK
Etag: 28995829ee85d69c4c18d597a0f68ae606a266cc
Last-Modified: Wed, 21 Nov 2012 16:04:56 GMT
$ curl -i http://eve-demo.herokuapp.com/people/Doe
HTTP/1.1 200 OK
Etag: 28995829ee85d69c4c18d597a0f68ae606a266cc
Last-Modified: Wed, 21 Nov 2012 16:04:56 GMT
{
"firstname": "John",
"lastname": "Doe",
"born": "Thu, 27 Aug 1970 14:37:13 GMT",
"role": ["author"],
"location": {"city": "Auburn", "address": "422 South Gay Street"},
"_id": "50acfba938345b0978fccad7"
"_updated": "Wed, 21 Nov 2012 16:04:56 GMT",
"_created": "Wed, 21 Nov 2012 16:04:56 GMT",
"_etag": "28995829ee85d69c4c18d597a0f68ae606a266cc",
"_links": {
"self": {"href": "eve-demo.herokuapp.com/people/50acfba938345b0978fccad7", "title": "person"},
"parent": {"href": "eve-demo.herokuapp.com", "title": "home"},
"collection": {"href": "http://eve-demo.herokuapp.com/people", "title": "people"}
}
}
Filtering and Sorting
$ curl -i http://eve-demo.herokuapp.com/people?where={"lastname": "Doe"}
HTTP/1.1 200 OK
Sorting
$ curl -i http://eve-demo.herokuapp.com/people?sort=[("lastname", -1)]
HTTP/1.1 200 OK
Pagination
Resource pagination is enabled by default in order to improve performance and preserve bandwidth
$ curl -i http://eve-demo.herokuapp.com/people?max_results=20&page=2
Mix then all
$ curl -i http://eve-demo.herokuapp.com/people?where={"lastname": "Doe"}&sort=[("firstname", 1)]&page=5
JSON and XML Rendering
Eve responses are automatically rendered as JSON (the default) or XML, depending on the request Accept
header. Inbound documents (for inserts and edits) are in JSON format.
XML
$ curl -H "Accept: application/xml" -i http://eve-demo.herokuapp.com
<resource>
<link rel="child" href="eve-demo.herokuapp.com/people" title="people" />
<link rel="child" href="eve-demo.herokuapp.com/works" title="works" />
</resource>
Data Integrity and Control
{
"_status": "OK",
"_updated": "Fri, 23 Nov 2012 08:11:19 GMT",
"_id": "50adfa4038345b1049c88a37",
"_etag": "372fbbebf54dfe61742556f17a8461ca9a6f5a11"
"_links": {"self": "..."}
}
$ curl -H "If-Match: 80b81f314712932a4d4ea75ab0b76a4eea613012" -X PATCH -i http://eve-
demo.herokuapp.com/people/50adfa4038345b1049c88a37 -d '{"firstname": "ronald"}'
Bulk Inserts
$ curl -d '{"firstname": "barack", "lastname": "obama"}' -H 'Content-Type: application/json'
http://eve-demo.herokuapp.com/people
HTTP/1.1 201 OK
In this case the response payload will just contain the relevant document metadata:
{
"_status": "OK",
"_updated": "Thu, 22 Nov 2012 15:22:27 GMT",
"_id": "50ae43339fa12500024def5b",
"_etag": "749093d334ebd05cf7f2b7dbfb7868605578db2c"
"_links": {"self": {"href": "eve-demo.herokuapp.com/people/50ae43339fa12500024def5b",
"title": "person"}}
}
$ curl -d '[{"firstname": "barack", "lastname": "obama"}, {"firstname": "mitt", "lastname": "romney"}]' -H
'Content-Type: application/json' http://eve-demo.herokuapp.com/people
HTTP/1.1 201 OK
{
"_status": "OK",
"_items": [
{
"_status": "OK",
"_updated": "Thu, 22 Nov 2012 15:22:27 GMT",
"_id": "50ae43339fa12500024def5b",
"_etag": "749093d334ebd05cf7f2b7dbfb7868605578db2c"
"_links": {"self": {"href": "eve-demo.herokuapp.com/people/50ae43339fa12500024def5b", "title":
"person"}}
},
{
"_status": "OK",
"_updated": "Thu, 22 Nov 2012 15:22:27 GMT",
"_id": "50ae43339fa12500024def5c",
"_etag": "62d356f623c7d9dc864ffa5facc47dced4ba6907"
"_links": {"self": {"href": "eve-demo.herokuapp.com/people/50ae43339fa12500024def5c", "title":
"person"}}
}
]
}
Data Validation
{
"_status": "ERR",
"_error": "Some documents contains errors",
"_items": [
{
"_status": "ERR",
"_issues": {"lastname": "value 'clinton' not unique"}
},
{
"_status": "OK",
}
]
]
Authentication
Customizable Basic Authentication (RFC-2617), Token-based authentication and HMAC-based Authentication
are supported.
You can lockdown the whole API, or just some endpoints
. You can also restrict CRUD commands, like allowing open read-only access while restricting edits, inserts
and deletes to authorized users. Role-based access control is supported as well
Read-only by default
If all you need is a read-only API, then you can have it up and running in a matter of minutes.
Projections
curl -i http://eve-demo.herokuapp.com/people?projection={"lastname": 1, "born": 1}
$ curl -i http://eve-demo.herokuapp.com/people?projection={"born": 0}
Embedded Resource
DOMAIN = {
'emails': {
'schema': {
'author': {
'type': 'objectid',
'data_relation': {
'resource': 'users',
'field': '_id',
'embeddable': True
},
},
'subject': {'type': 'string'},
'body': {'type': 'string'},
}
}
Event Hooks
>>> def pre_get_callback(resource, request, lookup):
... print 'A GET request on the "%s" endpoint has just been received!' % resource
>>> def pre_contacts_get_callback(request, lookup):
... print 'A GET request on the contacts endpoint has just been received!'
>>> app = Eve()
>>> app.on_pre_GET += pre_get_callback
>>> app.on_pre_GET_contacts += pre_contacts_get_callback
>>> app.run()
Post-Request Event Hooks
>>> def post_get_callback(resource, request, payload):
... print 'A GET on the "%s" endpoint was just performed!' % resource
>>> def post_contacts_get_callback(request, payload):
... print 'A get on "contacts" was just performed!'
>>> app = Eve()
>>> app.on_post_GET += post_get_callback
>>> app.on_post_GET_contacts += post_contacts_get_callback
>>> app.run()
Database event hooks
>>> def add_signature(resource, response):
... response['SIGNATURE'] = "A %s from eve" % resource
>>> app = Eve()
>>> app.on_fetched_item += add_signature
ETC...
Rate Limiting
X-RateLimit-Remaining: 299
X-RateLimit-Limit: 300
X-RateLimit-Reset: 1370940300
File Storage
Media files (images, pdf, etc.) can be uploaded as media document fields. Upload is done via POST, PUT and PATCH
as usual, but using the multipart/data-form content-type.
accounts = {
'name': {'type': 'string'},
'pic': {'type': 'media'},
...
}
$ curl -F "name=john" -F "pic=@profile.jpg" http://example.com/accounts
{
'_items': [
{
'_updated':'Sat, 05 Apr 2014 15:52:53 GMT',
'pic':'iVBORw0KGgoAAAANSUhEUgAAA4AAAAOACA...',
}
]
...
}
Ejemplos

More Related Content

PDF
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK - Nicola Iarocci - Co...
PPTX
DevOps and Chef
PDF
Eve - REST API for Humans™
PDF
Apache CouchDB talk at Ontario GNU Linux Fest
PDF
Redis for your boss
PDF
Redis for your boss 2.0
PDF
Introduction to Flask Micro Framework
PPT
Play!ng with scala
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK - Nicola Iarocci - Co...
DevOps and Chef
Eve - REST API for Humans™
Apache CouchDB talk at Ontario GNU Linux Fest
Redis for your boss
Redis for your boss 2.0
Introduction to Flask Micro Framework
Play!ng with scala

What's hot (20)

KEY
Zendcon 09
PPTX
Python Code Camp for Professionals 3/4
PDF
Beyond Phoenix
PPTX
Python Code Camp for Professionals 4/4
PDF
Rest api with Python
PDF
RESTful Web API and MongoDB go for a pic nic
PDF
Python RESTful webservices with Python: Flask and Django solutions
PDF
Ruby gems
PDF
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
PDF
Burn down the silos! Helping dev and ops gel on high availability websites
PPTX
CouchDB Day NYC 2017: Mango
PDF
Flask - Backend com Python - Semcomp 18
PDF
Django - 次の一歩 gumiStudy#3
ODP
My app is secure... I think
PDF
Postman On Steroids
PDF
Lies, Damn Lies, and Benchmarks
PDF
Fun with Python
PDF
A Little Backbone For Your App
PDF
Introduction to Nodejs
PDF
Stop Worrying & Love the SQL - A Case Study
Zendcon 09
Python Code Camp for Professionals 3/4
Beyond Phoenix
Python Code Camp for Professionals 4/4
Rest api with Python
RESTful Web API and MongoDB go for a pic nic
Python RESTful webservices with Python: Flask and Django solutions
Ruby gems
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
Burn down the silos! Helping dev and ops gel on high availability websites
CouchDB Day NYC 2017: Mango
Flask - Backend com Python - Semcomp 18
Django - 次の一歩 gumiStudy#3
My app is secure... I think
Postman On Steroids
Lies, Damn Lies, and Benchmarks
Fun with Python
A Little Backbone For Your App
Introduction to Nodejs
Stop Worrying & Love the SQL - A Case Study
Ad

Viewers also liked (13)

PDF
Aplicando controles de segurança em API’s, por Erick Tedeschi
PPTX
An introduction to Mobile Development (Spanish)
PPTX
Indoor Positioning System with iBeacons
PPTX
iOS 7
PPTX
WWDC 2014
PPTX
Deferred object
PPTX
The Internet own boy
PPTX
Unit testing
PPTX
WWDC 2016
PPTX
Mobile architecture problems and solutions.
PPTX
Hooked - How to build habit forming products
PDF
Rest Introduction (Chris Jimenez)
PDF
Developing RESTful Web APIs with Python, Flask and MongoDB
Aplicando controles de segurança em API’s, por Erick Tedeschi
An introduction to Mobile Development (Spanish)
Indoor Positioning System with iBeacons
iOS 7
WWDC 2014
Deferred object
The Internet own boy
Unit testing
WWDC 2016
Mobile architecture problems and solutions.
Hooked - How to build habit forming products
Rest Introduction (Chris Jimenez)
Developing RESTful Web APIs with Python, Flask and MongoDB
Ad

Similar to REST with Eve and Python (20)

PPT
Architecture | Busy Java Developers Guide to NoSQL | Ted Neward
KEY
Using and scaling Rack and Rack-based middleware
KEY
[Coscup 2012] JavascriptMVC
PDF
CouchDB Mobile - From Couch to 5K in 1 Hour
KEY
Couchdb: No SQL? No driver? No problem
PDF
Rails 3: Dashing to the Finish
PDF
Flask and Angular: An approach to build robust platforms
PDF
12 core technologies you should learn, love, and hate to be a 'real' technocrat
PDF
Rails 3 overview
PPTX
Android and REST
PPTX
RESTful API 제대로 만들기
PPT
Intro to php
KEY
PDF
How to build a High Performance PSGI/Plack Server
KEY
Mojolicious - A new hope
PDF
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
PPTX
PSGI and Plack from first principles
ODP
Implementing Comet using PHP
PPTX
Fully Automate Application Delivery with Puppet and F5 - PuppetConf 2014
PDF
Presto anatomy
Architecture | Busy Java Developers Guide to NoSQL | Ted Neward
Using and scaling Rack and Rack-based middleware
[Coscup 2012] JavascriptMVC
CouchDB Mobile - From Couch to 5K in 1 Hour
Couchdb: No SQL? No driver? No problem
Rails 3: Dashing to the Finish
Flask and Angular: An approach to build robust platforms
12 core technologies you should learn, love, and hate to be a 'real' technocrat
Rails 3 overview
Android and REST
RESTful API 제대로 만들기
Intro to php
How to build a High Performance PSGI/Plack Server
Mojolicious - A new hope
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
PSGI and Plack from first principles
Implementing Comet using PHP
Fully Automate Application Delivery with Puppet and F5 - PuppetConf 2014
Presto anatomy

Recently uploaded (20)

PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Electronic commerce courselecture one. Pdf
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Advanced IT Governance
PDF
Modernizing your data center with Dell and AMD
PDF
KodekX | Application Modernization Development
PPT
Teaching material agriculture food technology
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PPTX
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
PDF
Chapter 2 Digital Image Fundamentals.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
AI And Its Effect On The Evolving IT Sector In Australia - Elevate
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Cloud computing and distributed systems.
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Empathic Computing: Creating Shared Understanding
PDF
HCSP-Presales-Campus Network Planning and Design V1.0 Training Material-Witho...
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Electronic commerce courselecture one. Pdf
NewMind AI Weekly Chronicles - August'25 Week I
Advanced IT Governance
Modernizing your data center with Dell and AMD
KodekX | Application Modernization Development
Teaching material agriculture food technology
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
Chapter 2 Digital Image Fundamentals.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
AI And Its Effect On The Evolving IT Sector In Australia - Elevate
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Cloud computing and distributed systems.
20250228 LYD VKU AI Blended-Learning.pptx
Empathic Computing: Creating Shared Understanding
HCSP-Presales-Campus Network Planning and Design V1.0 Training Material-Witho...

REST with Eve and Python

  • 2. Lo necesario Intentar crear un API Rest con Python Que cumpla con todos los estandares REST Que sea facil de utilizar y probar Que sea customizable Que tenga buena documentacion y soporte Que utilize y se integre con Mongo facilmente
  • 3. Lo Necesario Todo esto en 3 Dias!!!
  • 6. Flask Flask is a microframework for Python based on Werkzeug, Jinja 2 and good intentions. And before you ask: It's BSD licensed!
  • 7. Flask is Fun from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
  • 8. And Easy to Setup $ pip install Flask $ python hello.py
  • 9. Eve
  • 10. Python REST API Framework Powered by Flask, MongoDB, Redis and good intentions Eve allows to effortlessly build and deploy highly customizable, fully featured RESTful Web Services
  • 11. Eve is Simple from eve import Eve app = Eve() app.run()
  • 12. The API is now live, ready to be consumed: $ curl -i http://example.com/people HTTP/1.1 200 OK
  • 13. REST, Flask and MongoDB REST, Flask and MongoDB supported
  • 14. Installation $ pip install eve $ easy_install eve
  • 15. Ejemplo from eve import Eve app = Eve() if __name__ == '__main__': app.run()
  • 16. Despues creamos un Settings Creamos un settings.py DOMAIN = {'people': {}}
  • 17. Response { "_links": { "child": [ { "href": "/people", "title": "people" } ] } }
  • 18. Now request $ curl http://127.0.0.1:5000/people { "_items": [], "_links": { "self": { "href": "/people", "title": "people" }, "parent": { "href": "", "title": "home" } } }
  • 19. HATEOAS API entry points adhere to the HATEOAS Hypermedia as the Engine of Application State (HATEOAS)
  • 20. HATEOAS The principle is that a client interacts with a network application entirely through hypermedia provided dynamically by application servers
  • 21. Database Interlude # 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 MONGO_USERNAME = 'user' MONGO_PASSWORD = 'user' MONGO_DBNAME = 'apitest'
  • 22. A More Complex Application So far our API has been read-only. Let’s enable the full spectrum of CRUD operations: # 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']
  • 23. Schema schema = { # Schema definition, based on Cerberus grammar. Check the Cerberus project # (https://github.com/nicolaiarocci/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, },
  • 24. # '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', }, }
  • 25. Better Customization Now let’s say that we want to further customize the people endpoint 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' },
  • 26. # 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 }
  • 28. Full range of CRUD Action HTTP Verb Context Create POST Collection Read GET, HEAD Collection/Document Update PATCH Document Replace PUT Document Delete DELETECollection/Document
  • 29. More info Field Description _created item creation date. _updated item last updated on. _etag ETag, to be used for concurrency control and conditional requests. _id unique item key, also needed to access the individual item endpoint.
  • 30. Sub Resources Endpoints support sub-resources so you could have something like:/people/<contact_id>/invoices invoices = { 'url': 'people/<regex("[a-f0-9]{24}"):contact_id>/invoices' Then this GET to the endpoint, which would roughly translate to give me all the invoices by <contact_id>:
  • 31. Customizable, item endpoints Resources can or cannot expose individual item endpoints. API consumers could get access to /people, /people/<ObjectId> and /people/Doe $ curl -i http://eve-demo.herokuapp.com/people/521d6840c437dc0002d1203c HTTP/1.1 200 OK Etag: 28995829ee85d69c4c18d597a0f68ae606a266cc Last-Modified: Wed, 21 Nov 2012 16:04:56 GMT $ curl -i http://eve-demo.herokuapp.com/people/Doe HTTP/1.1 200 OK Etag: 28995829ee85d69c4c18d597a0f68ae606a266cc Last-Modified: Wed, 21 Nov 2012 16:04:56 GMT
  • 32. { "firstname": "John", "lastname": "Doe", "born": "Thu, 27 Aug 1970 14:37:13 GMT", "role": ["author"], "location": {"city": "Auburn", "address": "422 South Gay Street"}, "_id": "50acfba938345b0978fccad7" "_updated": "Wed, 21 Nov 2012 16:04:56 GMT", "_created": "Wed, 21 Nov 2012 16:04:56 GMT", "_etag": "28995829ee85d69c4c18d597a0f68ae606a266cc", "_links": { "self": {"href": "eve-demo.herokuapp.com/people/50acfba938345b0978fccad7", "title": "person"}, "parent": {"href": "eve-demo.herokuapp.com", "title": "home"}, "collection": {"href": "http://eve-demo.herokuapp.com/people", "title": "people"} } }
  • 33. Filtering and Sorting $ curl -i http://eve-demo.herokuapp.com/people?where={"lastname": "Doe"} HTTP/1.1 200 OK
  • 34. Sorting $ curl -i http://eve-demo.herokuapp.com/people?sort=[("lastname", -1)] HTTP/1.1 200 OK
  • 35. Pagination Resource pagination is enabled by default in order to improve performance and preserve bandwidth $ curl -i http://eve-demo.herokuapp.com/people?max_results=20&page=2
  • 36. Mix then all $ curl -i http://eve-demo.herokuapp.com/people?where={"lastname": "Doe"}&sort=[("firstname", 1)]&page=5
  • 37. JSON and XML Rendering Eve responses are automatically rendered as JSON (the default) or XML, depending on the request Accept header. Inbound documents (for inserts and edits) are in JSON format.
  • 38. XML $ curl -H "Accept: application/xml" -i http://eve-demo.herokuapp.com <resource> <link rel="child" href="eve-demo.herokuapp.com/people" title="people" /> <link rel="child" href="eve-demo.herokuapp.com/works" title="works" /> </resource>
  • 39. Data Integrity and Control { "_status": "OK", "_updated": "Fri, 23 Nov 2012 08:11:19 GMT", "_id": "50adfa4038345b1049c88a37", "_etag": "372fbbebf54dfe61742556f17a8461ca9a6f5a11" "_links": {"self": "..."} }
  • 40. $ curl -H "If-Match: 80b81f314712932a4d4ea75ab0b76a4eea613012" -X PATCH -i http://eve- demo.herokuapp.com/people/50adfa4038345b1049c88a37 -d '{"firstname": "ronald"}'
  • 41. Bulk Inserts $ curl -d '{"firstname": "barack", "lastname": "obama"}' -H 'Content-Type: application/json' http://eve-demo.herokuapp.com/people HTTP/1.1 201 OK In this case the response payload will just contain the relevant document metadata: { "_status": "OK", "_updated": "Thu, 22 Nov 2012 15:22:27 GMT", "_id": "50ae43339fa12500024def5b", "_etag": "749093d334ebd05cf7f2b7dbfb7868605578db2c" "_links": {"self": {"href": "eve-demo.herokuapp.com/people/50ae43339fa12500024def5b", "title": "person"}} }
  • 42. $ curl -d '[{"firstname": "barack", "lastname": "obama"}, {"firstname": "mitt", "lastname": "romney"}]' -H 'Content-Type: application/json' http://eve-demo.herokuapp.com/people HTTP/1.1 201 OK { "_status": "OK", "_items": [ { "_status": "OK", "_updated": "Thu, 22 Nov 2012 15:22:27 GMT", "_id": "50ae43339fa12500024def5b", "_etag": "749093d334ebd05cf7f2b7dbfb7868605578db2c" "_links": {"self": {"href": "eve-demo.herokuapp.com/people/50ae43339fa12500024def5b", "title": "person"}} },
  • 43. { "_status": "OK", "_updated": "Thu, 22 Nov 2012 15:22:27 GMT", "_id": "50ae43339fa12500024def5c", "_etag": "62d356f623c7d9dc864ffa5facc47dced4ba6907" "_links": {"self": {"href": "eve-demo.herokuapp.com/people/50ae43339fa12500024def5c", "title": "person"}} } ] }
  • 44. Data Validation { "_status": "ERR", "_error": "Some documents contains errors", "_items": [ { "_status": "ERR", "_issues": {"lastname": "value 'clinton' not unique"} }, { "_status": "OK", } ] ]
  • 45. Authentication Customizable Basic Authentication (RFC-2617), Token-based authentication and HMAC-based Authentication are supported. You can lockdown the whole API, or just some endpoints . You can also restrict CRUD commands, like allowing open read-only access while restricting edits, inserts and deletes to authorized users. Role-based access control is supported as well
  • 46. Read-only by default If all you need is a read-only API, then you can have it up and running in a matter of minutes.
  • 48. $ curl -i http://eve-demo.herokuapp.com/people?projection={"born": 0}
  • 49. Embedded Resource DOMAIN = { 'emails': { 'schema': { 'author': { 'type': 'objectid', 'data_relation': { 'resource': 'users', 'field': '_id', 'embeddable': True }, }, 'subject': {'type': 'string'}, 'body': {'type': 'string'}, } }
  • 50. Event Hooks >>> def pre_get_callback(resource, request, lookup): ... print 'A GET request on the "%s" endpoint has just been received!' % resource >>> def pre_contacts_get_callback(request, lookup): ... print 'A GET request on the contacts endpoint has just been received!' >>> app = Eve() >>> app.on_pre_GET += pre_get_callback >>> app.on_pre_GET_contacts += pre_contacts_get_callback >>> app.run()
  • 51. Post-Request Event Hooks >>> def post_get_callback(resource, request, payload): ... print 'A GET on the "%s" endpoint was just performed!' % resource >>> def post_contacts_get_callback(request, payload): ... print 'A get on "contacts" was just performed!' >>> app = Eve() >>> app.on_post_GET += post_get_callback >>> app.on_post_GET_contacts += post_contacts_get_callback >>> app.run()
  • 52. Database event hooks >>> def add_signature(resource, response): ... response['SIGNATURE'] = "A %s from eve" % resource >>> app = Eve() >>> app.on_fetched_item += add_signature
  • 55. File Storage Media files (images, pdf, etc.) can be uploaded as media document fields. Upload is done via POST, PUT and PATCH as usual, but using the multipart/data-form content-type. accounts = { 'name': {'type': 'string'}, 'pic': {'type': 'media'}, ... }
  • 56. $ curl -F "name=john" -F "[email protected]" http://example.com/accounts { '_items': [ { '_updated':'Sat, 05 Apr 2014 15:52:53 GMT', 'pic':'iVBORw0KGgoAAAANSUhEUgAAA4AAAAOACA...', } ] ... }