Skip to main content

Latest version on PyPI Build status Python versions Software license Black code formatting

Swagger extension for Eve powered RESTful APIs.

Usage

from eve import Eve
from eve_swagger import get_swagger_blueprint, add_documentation

app = Eve()
swagger = get_swagger_blueprint()
app.register_blueprint(swagger)

# required. See http://swagger.io/specification/#infoObject for details.
app.config['SWAGGER_INFO'] = {
    'title': 'My Supercool API',
    'version': '1.0',
    'description': 'an API description',
    'termsOfService': 'my terms of service',
    'contact': {
        'name': 'nicola',
        'url': 'http://nicolaiarocci.com'
    },
    'license': {
        'name': 'BSD',
        'url': 'https://github.com/pyeve/eve-swagger/blob/master/LICENSE',
    },
    'schemes': ['http', 'https'],
}

# optional. Will use flask.request.host if missing.
app.config['SWAGGER_HOST'] = 'https://myhost.com'

# optional. Add/Update elements in the documentation at run-time without deleting subtrees.
add_documentation(swagger, {'paths': {'/status': {'get': {'parameters': [
    {
        'in': 'query',
        'name': 'foobar',
        'required': False,
        'description': 'special query parameter',
        'type': 'string'
    }]
}}}})

if __name__ == '__main__':
    app.run()

When the API is up and running, visit the /api-docs endpoint. The resulting JSON can then be used with swagger tooling, like the Swagger UI or Swagger Editor:

resources/swagger_editor.png

If you get the error “Can’t read from server. It may not have the appropriate access-control-origin settings” from Swagger UI, you might want to enable CORS support with the X_DOMAINS and X_HEADERS configuration in your Eve settings.py:

X_DOMAINS = ['http://localhost:8000',  # The domain where Swagger UI is running
             'http://editor.swagger.io',
             'http://petstore.swagger.io']
X_HEADERS = ['Content-Type', 'If-Match', 'Authorization']  # Needed for the "Try it out" buttons

For more information check the CORS documentation of Swagger UI and Swagger Editor.

Installation

$ pip install eve-swagger

Description fields on the swagger docs

If you would like to include description fields to your swagger docs you can include a description field in your schema validations in your settings.py. This can be done per field as well as on the resource-level.

As an example:

...
'description': 'Description of the user resource',
'schema': {
    'userName': {
        'description': 'The username of the logged in user.',
        'type': 'string',
        'minlength': 1,
        'maxlength': 256,
        'required': True
    },
}
...
NOTE: If you do use this feature, you also need to provide a custom validator

to the Eve instance, otherwise you will get complaints from the Cerberus library about “unknown rule ‘description’ for field [yourFieldName]”

from eve.io.mongo import Validator

class MyValidator(Validator):
    def _validate_description(self, description, field, value):
        """ {'type': 'string'} """
        # Accept description attribute, used for swagger doc generation
        pass

    def _validate_example(self, description, field, value):
        """ {'type': 'string'} """
        # Accept an example attribute, used for swagger doc generation
        pass

app = Eve(validator=MyValidator)
NOTE: Swagger 2.0 may show errors about example attribute (“should NOT have additional properties”).

You can disable generating example attribute by specifying in the app.py:

...
app.config['SWAGGER_EXAMPLE_FIELD_REMOVE'] = True
...

Disabling the documentation of a resource

You can disable the documentation of a specific resource by adding a disable_documentation field to the resource definition in settings.py. This means that the resource will not show up in the paths or definitions sections of the swagger docs.

...
'person': {
    'item_title': 'person',
    'disable_documentation': True,
    'schema': {...}
}
...

Enabling the documentation of Eve event hooks

By setting app.config['ENABLE_HOOK_DESCRIPTION'] to True you can enable the description of all Eve event hooks. This is done by showing the docstrings of the callback functions in the swagger docs under the appropriate paths.

def foo(request, lookup):
    """ Do something before GETting all the people """
    pass
def bar(response):
    """ Do something when you've fetched the database entries """
    pass
...
app.config['ENABLE_HOOK_DESCRIPTION'] = True
...
app.on_pre_GET_people += foo
app.on_fetched_resource_people += bar

The swagger docs will now look like this:

"paths": {
    "/people": {
        "get": {
            ...,
            "description": "**Hooks**:\n* `on_pre_GET_people`:\n\n  * `foo`:\n\n    Do something before GETting all the people\n\n\n* `on_fetched_resource_people`:\n\n  * `bar`:\n\n    Do something when you've fetched the database entries\n\n"
        }
    }
}

Which will be rendered by Swagger like this:

resources/hook_description.png

Example fields on the docs

Like a description, an example can be added to a field.

...
'schema': {
    'lastName': {
        'example': 'Doe',
        'type': 'string',
        'minlength': 1,
    },
}
...

The example is shown in the swagger ui in the model and the responses.

resources/example_field.png

NOTE: If you do use this feature, you also need to provide a custom validator to the Eve instance, otherwise you will get complaints from the Cerberus library about “unknown rule ‘example’ for field [yourFieldName]” (see the above example for the ‘description’ option.)

from eve.io.mongo import Validator

class MyValidator(Validator):
    def _validate_example(self, example, field, value):
        if example and not isinstance(value, str):
            self._error(field, "Value must be a string")

...

app = Eve(validator=MyValidator)

Example resources on the docs

Like a description, an example can be added to a resource.

...
'sub_resource': {
    'description': 'A sub resource to test regex urls.',
    'url': 'people/<regex("[a-f0-9]{24}"):personid>/related',
    'example': {'subject': 'A sub_resource object example'},

    'schema': {
        'personid': {
            'type': 'objectid',
            'data_relation': {
                'resource': 'people',
                'field': '_id', },
        },
        'subject': {'type': 'string'},
    }
},
...

The resource example overrides the example generated from the schema definition, and can be used to hide fields that are defined on the server side. The example is shown in the swagger ui in the parameters only.

Metadata

Release files for Eve-Swagger 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for Eve-Swagger 0.2.0
File Size Uploaded
Eve-Swagger-0.2.0.tar.gz 18.4 kB Details

Release files / Eve-Swagger-0.2.0.tar.gz

Download URL Eve-Swagger-0.2.0.tar.gz
Size 18.4 kB
Tags Source
SHA-256 checksum
How to use checksums
ef18dc62645c25c80c285194a2f193c9b9b1b9fe6950a2470977411354be924e
BLAKE2b-256 checksum
How to use checksums
5c0216e25b256eb17d36da2c64c301570f3a67ef39cc0971882495874443a763
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.12.1 setuptools/41.4.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/2.7.17

Release history Release notifications | RSS feed

This release

0.2.0 This release

1 release file

0.1.4

1 release file

0.1.3

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1.0

1 release file

0.0.11

1 release file

0.0.10

1 release file

0.0.9

1 release file

0.0.8

1 release file

0.0.7

1 release file

0.0.6

1 release file

0.0.5

1 release file

0.0.4

1 release file

0.0.3

1 release file

0.0.2

1 release file

0.0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page