Source code for falcon.media.validators.jsonschema

from __future__ import absolute_import

from functools import wraps

import falcon

try:
    import jsonschema
except ImportError:
    pass


[docs]def validate(req_schema=None, resp_schema=None): """Decorator for validating ``req.media`` using JSON Schema. This decorator provides standard JSON Schema validation via the ``jsonschema`` package available from PyPI. Semantic validation via the *format* keyword is enabled for the default checkers implemented by ``jsonschema.FormatChecker``. Note: The `jsonschema`` package must be installed separately in order to use this decorator, as Falcon does not install it by default. See `json-schema.org <http://json-schema.org/>`_ for more information on defining a compatible dictionary. Args: req_schema (dict, optional): A dictionary that follows the JSON Schema specification. The request will be validated against this schema. resp_schema (dict, optional): A dictionary that follows the JSON Schema specification. The response will be validated against this schema. Example: .. code:: python from falcon.media.validators import jsonschema # -- snip -- @jsonschema.validate(my_post_schema) def on_post(self, req, resp): # -- snip -- """ def decorator(func): @wraps(func) def wrapper(self, req, resp, *args, **kwargs): if req_schema is not None: try: jsonschema.validate( req.media, req_schema, format_checker=jsonschema.FormatChecker() ) except jsonschema.ValidationError as e: raise falcon.HTTPBadRequest( 'Request data failed validation', description=e.message ) result = func(self, req, resp, *args, **kwargs) if resp_schema is not None: try: jsonschema.validate( resp.media, resp_schema, format_checker=jsonschema.FormatChecker() ) except jsonschema.ValidationError: raise falcon.HTTPInternalServerError( 'Response data failed validation' # Do not return 'e.message' in the response to # prevent info about possible internal response # formatting bugs from leaking out to users. ) return result return wrapper return decorator