A Twisted Web REST micro-framework
Project description
Based on Flask API, with plans for integrated multiprocessing support for full usage of all CPUs. Provides a more Flask/Sinatra-style API on top of the core twisted.web APIs. Integrates FormEncode for path, form and query argument validation.
An example of a multi–module twisted.web CorePost REST application which exposes two separate REST services (for a Customer and Customer Address entities):
class CustomerRESTService():
path = "/customer"
@route("/")
def getAll(self,request):
return DB.getAllCustomers()
@route("/<customerId>")
def get(self,request,customerId):
return DB.getCustomer(customerId)
@route("/",Http.POST)
def post(self,request,customerId,firstName,lastName):
customer = Customer(customerId, firstName, lastName)
DB.saveCustomer(customer)
return Response(201)
@route("/<customerId>",Http.PUT)
def put(self,request,customerId,firstName,lastName):
c = DB.getCustomer(customerId)
(c.firstName,c.lastName) = (firstName,lastName)
return Response(200)
@route("/<customerId>",Http.DELETE)
def delete(self,request,customerId):
DB.deleteCustomer(customerId)
return Response(200)
@route("/",Http.DELETE)
def deleteAll(self,request):
DB.deleteAllCustomers()
return Response(200)
class CustomerAddressRESTService():
path = "/customer/<customerId>/address"
@route("/")
def getAll(self,request,customerId):
return DB.getCustomer(customerId).addresses
@route("/<addressId>")
def get(self,request,customerId,addressId):
return DB.getCustomerAddress(customerId, addressId)
@route("/",Http.POST)
def post(self,request,customerId,addressId,streetNumber,streetName,stateCode,countryCode):
c = DB.getCustomer(customerId)
address = CustomerAddress(streetNumber,streetName,stateCode,countryCode)
c.addresses[addressId] = address
return Response(201)
@route("/<addressId>",Http.PUT)
def put(self,request,customerId,addressId,streetNumber,streetName,stateCode,countryCode):
address = DB.getCustomerAddress(customerId, addressId)
(address.streetNumber,address.streetName,address.stateCode,address.countryCode) = (streetNumber,streetName,stateCode,countryCode)
return Response(200)
@route("/<addressId>",Http.DELETE)
def delete(self,request,customerId,addressId):
DB.getCustomerAddress(customerId, addressId) #validate address exists
del(DB.getCustomer(customerId).addresses[addressId])
return Response(200)
@route("/",Http.DELETE)
def deleteAll(self,request,customerId):
c = DB.getCustomer(customerId)
c.addresses = {}
return Response(200)
def run_rest_app():
app = RESTResource((CustomerRESTService(),CustomerAddressRESTService()))
app.run(8080)
if __name__ == "__main__":
run_rest_app()
And the BDD showing off its different features
https://github.com/jacek99/corepost/blob/master/corepost/test/feature/rest_app.feature
Links
Changelog
- 0.0.16:
- minor bug fix for issue #4 (serializing object graphs to XML), removed Jinja2 as dependency:
- 0.0.15:
minor bug fixes in auto-converting responses to JSON and parsing arguments/paths with unexpectec characters
- 0.0.14:
automatic parsing of query, form, JSON, YAML and XML arguments: http://jacek99.github.com/corepost/argument_parsing.html
- 0.0.13:
perf fix to avoid unnecessary string concatenation when doing URL routing, after code review (thanks to Gerald Tremblay)
- 0.0.12:
backwards incompatible change: added advanced URL routing for nested REST services. CorePost object is gone, REST services are now just standard classes. They get wrapped in a RESTResource object (see sample above) when exposed
- 0.0.11:
added support for request/response filters
- 0.0.10:
removed dependency on txZMQ which was not needed at this point (yet)
- 0.0.9:
- fix for issue #3 (wrong class passes as ‘self’ to router method):
- 0.0.8:
support for serializing of classes to JSON,XML,YAML based on caller’s Accept header
separate routing functionality from CorePost Resource object, in preparation for future multicore support
- 0.0.7:
automatic parsing of incoming content (JSON, YAML, XML)
routing by incoming content type
automatic response conversion based on caller’s Accept header (JSON/YAML
support for defer.returnValue() in @inlineCallbacks route methods
0.0.6 - redesigned API around classes and methods, rather than functions and global objects (after feedback from Twisted devs)
0.0.5 - added FormEncode validation for arguments
0.0.4 - path argument extraction, mandatory argument error checking
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.