Package: odinweb
=======OdinWeb=======A Restful API framework for Python that uses Odin Resources with native support for `Swagger <https://swagger.io>`_and an integrated Swagger-UI... image:: https://img.shields.io/pypi/l/odinweb.svg?style=flat:target: https://pypi.python.org/pypi/odinweb/:alt: License.. image:: https://img.shields.io/pypi/v/odinweb.svg?style=flat:target: https://pypi.python.org/pypi/odinweb/.. image:: https://img.shields.io/travis/python-odin/odinweb/master.svg?style=flat:target: https://travis-ci.org/python-odin/odinweb:alt: Travis CI Status.. image:: https://codecov.io/gh/python-odin/odinweb/branch/master/graph/badge.svg:target: https://codecov.io/gh/python-odin/odinweb:alt: Code cov.. image:: https://landscape.io/github/python-odin/odinweb/master/landscape.svg?style=flat:target: https://landscape.io/github/python-odin/odinweb/master:alt: Code Health.. image:: https://img.shields.io/requires/github/python-odin/odinweb.svg?style=flat:target: https://requires.io/github/python-odin/odinweb/requirements/?branch=master:alt: Requirements Status.. image:: https://img.shields.io/badge/gitterim-timsavage.odin-brightgreen.svg?style=flat:target: https://gitter.im/timsavage/odin:alt: Gitter.imThe initial development effort currently supports:- `Flask <http://flask.pocoo.org/>`_- `Bottle <https://bottlepy.org>`_- `Django <https://wwww.djangoproject.org/>`_ - Odin/Django integration is already implemented with`baldr <https://github.com/python-odin/baldr>`_. Odin Web is an evolution of the design of baldr. Baldr still includesother integration between django and odin, once merged Baldr will be depreciatedWith the following frameworks to be included once a stable API is established:- `Retort <https://github.com/timsavage/retort>`_ - A Flask/Bottle like framework for AWS Lambda/API GatewayThere are no plans at this point for other libraries although I'm open to suggestions/contributions. The effortrequired to integrate other libraries is minimal as Odin Web was designed to be agnostic of the framework it isrunning within... note::Odin Web is being developed very much with a view to dropping support for Python 2.7 in the future, back-portedversions of several Python 3.x features are utilised in the design (eg :py:mod:`enum` :py:mod:`http`).Installation============An early Alpha release is on PyPI, the API has however undergone significant changes since this was first put out thebest option is to checkout a tagged release from GitHub until a beta is ready that will solidify the APIInstall the core library::git clone git@github.com:python-odin/odinweb.gitcd odinwebpython setup.py installInstall your preferred web framework::git clone git@github.com:python-odin/odinweb.flask.git# orgit clone git@github.com:python-odin/odinweb.bottle.git# orgit clone git@github.com:python-odin/odinweb.django.git# Change into the appropriate directory thenpython setup.py installQuickstart==========Odin Web is very much oriented around Resources so first define your resources::import odinclass User(odin.Resource):"""User resource"""id = odin.IntegerField()username = odin.StringField()first_name = odin.StringField()last_name = odin.StringField()email = odin.EmailField()Next define your API::from odinweb import apiUSERS = [User(1, 'pimpstar24', 'Bender', 'Rodreges', 'bender@ilovebender.com'),User(2, 'zoidberg', 'Zoidberg', '', 'zoidberg@freemail.web'),User(3, 'amylove79', 'Amy', 'Wong', 'awong79@marslink.web'),]USER_ID = len(USERS)class UserApi(api.ResourceApi):resource = Usertags = ['user']@api.listingdef get_user_list(self, request, offset, limit):return USERS[offset:offset+limit], len(USERS)@api.createdef create_user(self, request, user):global USER_ID# Add user to listUSER_ID += 1user.id = USER_IDUSERS.append(user)return user@api.detaildef get_user(self, request, resource_id):"""Get a user object"""for user in USERS:if user.id == resource_id:return userraise api.Error.from_status(api.HTTPStatus.NOT_FOUND)@api.deletedef delete_user(self, request, resource_id):for idx, user in enumerate(USERS):if user.id == resource_id:USERS.remove(user)return api.create_response(200)raise api.Error.from_status(api.HTTPStatus.NOT_FOUND)This defines an API for listing, fetching and creating a users.Finally hookup to your web framework, in this case Flask and enable swagger spec::from flask import Flaskfrom odinweb.flask import ApiBlueprintfrom odinweb.swagger import SwaggerSpecapp = flask.Flask(__name__)app.register_blueprint(ApiBlueprint(# Use an API versionapi.ApiVersion(SwaggerSpec('Flask Example API', enable_ui=True),  # Support for Swagger!UserApi(),),debug_enabled=True,  # Enable debug output),)Start the flask app and you can browse to the swagger UI to try out the API::http://localhost:5000/api/v1/swagger/uiCORS====To enable CORS your API Interface (for Flask this is `ApiBlueprint`) needs tobe wrapped with the CORS wrapper eg::from flask import Flaskfrom odinweb.flask import ApiBlueprintfrom odinweb.cors import CORS, AnyOriginapp = flask.Flask(__name__)app.register_blueprint(CORS(ApiBlueprint(api.ApiVersion(UserApi())),origins=AnyOrigin))For customisation the CORS class can easily be inherited to customise how theorigin is determined (handy if your application is behind a reverse proxy).The CORS wrapper also accepts `max_age`, `allow_credentials`, `expose_headers`and `allow_headers` options.