Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork136
Openapi-core is a Python library that adds client-side and server-side support for the OpenAPI v3.0 and OpenAPI v3.1 specification.
License
python-openapi/openapi-core
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Openapi-core is a Python library that adds client-side and server-side supportfor theOpenAPI Specification v3.0.0.
Recommended way (via pip):
$ pip install openapi-core
Alternatively you can download the code and install from the repository:
$ pip install -e git+https://github.com/p1c2u/openapi-core.git#egg=openapi_core
Firstly create your specification:
fromopenapi_coreimportcreate_specspec=create_spec(spec_dict)
Now you can use it to validate requests
fromopenapi_core.validation.request.validatorsimportRequestValidatorvalidator=RequestValidator(spec)result=validator.validate(request)# raise errors if request invalidresult.raise_for_errors()# get list of errorserrors=result.errors
and unmarshal request data from validation result
# get parameters object with path, query, cookies and headers parametersvalidated_params=result.parameters# or specific parametersvalidated_path_params=result.parameters.path# get bodyvalidated_body=result.body# get security datavalidated_security=result.security
Request object should be instance of OpenAPIRequest class (SeeIntegrations).
You can also validate responses
fromopenapi_core.validation.response.validatorsimportResponseValidatorvalidator=ResponseValidator(spec)result=validator.validate(request,response)# raise errors if response invalidresult.raise_for_errors()# get list of errorserrors=result.errors
and unmarshal response data from validation result
# get headersvalidated_headers=result.headers# get datavalidated_data=result.data
Response object should be instance of OpenAPIResponse class (SeeIntegrations).
openapi-core supports security for authentication and authorization process. Security data for security schemas are accessible from security attribute of RequestValidationResult object.
For given security specification:
security: -BasicAuth:[] -ApiKeyAuth:[]components:securitySchemes:BasicAuth:type:httpscheme:basicApiKeyAuth:type:apiKeyin:headername:X-API-Key
you can access your security data the following:
result=validator.validate(request)# get basic auth decoded credentialsresult.security['BasicAuth']# get api keyresult.security['ApiKeyAuth']
Supported security types:
- http – for Basic and Bearer HTTP authentications schemes
- apiKey – for API keys and cookie authentication
Pass custom defined media type deserializers dictionary with supported mimetypes as a key to RequestValidator or ResponseValidator constructor:
defprotobuf_deserializer(message):feature=route_guide_pb2.Feature()feature.ParseFromString(message)returnfeaturecustom_media_type_deserializers= {'application/protobuf':protobuf_deserializer,}validator=ResponseValidator(spec,custom_media_type_deserializers=custom_media_type_deserializers)result=validator.validate(request,response)
OpenAPI defines aformat
keyword that hints at how a value should be interpreted, e.g. astring
with the typedate
should conform to the RFC 3339 date format.
Openapi-core comes with a set of built-in formatters, but it's also possible to add support for custom formatters for RequestValidator and ResponseValidator.
Here's how you could add support for ausdate
format that handles dates of the form MM/DD/YYYY:
fromdatetimeimportdatetimeimportreclassUSDateFormatter:defvalidate(self,value)->bool:returnbool(re.match(r"^\d{1,2}/\d{1,2}/\d{4}$",value))defunmarshal(self,value):returndatetime.strptime(value,"%m/%d/%y").datecustom_formatters= {'usdate':USDateFormatter(),}validator=ResponseValidator(spec,custom_formatters=custom_formatters)result=validator.validate(request,response)
For Django 2.2 you can use DjangoOpenAPIRequest a Django request factory:
fromopenapi_core.validation.request.validatorsimportRequestValidatorfromopenapi_core.contrib.djangoimportDjangoOpenAPIRequestopenapi_request=DjangoOpenAPIRequest(django_request)validator=RequestValidator(spec)result=validator.validate(openapi_request)
You can use DjangoOpenAPIResponse as a Django response factory:
fromopenapi_core.validation.response.validatorsimportResponseValidatorfromopenapi_core.contrib.djangoimportDjangoOpenAPIResponseopenapi_response=DjangoOpenAPIResponse(django_response)validator=ResponseValidator(spec)result=validator.validate(openapi_request,openapi_response)
This section describes integration withFalcon web framework.
Falcon API can be integrated by FalconOpenAPIMiddleware middleware.
fromopenapi_core.contrib.falcon.middlewaresimportFalconOpenAPIMiddlewareopenapi_middleware=FalconOpenAPIMiddleware.from_spec(spec)api=falcon.API(middleware=[openapi_middleware])
For Falcon you can use FalconOpenAPIRequest a Falcon request factory:
fromopenapi_core.validation.request.validatorsimportRequestValidatorfromopenapi_core.contrib.falconimportFalconOpenAPIRequestFactoryopenapi_request=FalconOpenAPIRequestFactory.create(falcon_request)validator=RequestValidator(spec)result=validator.validate(openapi_request)
You can use FalconOpenAPIResponse as a Falcon response factory:
fromopenapi_core.validation.response.validatorsimportResponseValidatorfromopenapi_core.contrib.falconimportFalconOpenAPIResponseFactoryopenapi_response=FalconOpenAPIResponseFactory.create(falcon_response)validator=ResponseValidator(spec)result=validator.validate(openapi_request,openapi_response)
Flask views can be integrated by FlaskOpenAPIViewDecorator decorator.
fromopenapi_core.contrib.flask.decoratorsimportFlaskOpenAPIViewDecoratoropenapi=FlaskOpenAPIViewDecorator.from_spec(spec)@app.route('/home')@openapidefhome():pass
If you want to decorate class based view you can use the decorators attribute:
classMyView(View):decorators= [openapi]
As an alternative to the decorator-based integration, Flask method based views can be integrated by inheritance from FlaskOpenAPIView class.
fromopenapi_core.contrib.flask.viewsimportFlaskOpenAPIViewclassMyView(FlaskOpenAPIView):passapp.add_url_rule('/home',view_func=MyView.as_view('home',spec))
In Flask, all unmarshalled request data are provided as Flask request object's openapi.parameters attribute
fromflask.globalsimportrequest@app.route('/browse/<id>/')@openapidefhome():browse_id=request.openapi.parameters.path['id']page=request.openapi.parameters.query.get('page',1)
You can use FlaskOpenAPIRequest a Flask/Werkzeug request factory:
fromopenapi_core.validation.request.validatorsimportRequestValidatorfromopenapi_core.contrib.flaskimportFlaskOpenAPIRequestopenapi_request=FlaskOpenAPIRequest(flask_request)validator=RequestValidator(spec)result=validator.validate(openapi_request)
You can use FlaskOpenAPIResponse as a Flask/Werkzeug response factory:
fromopenapi_core.validation.response.validatorsimportResponseValidatorfromopenapi_core.contrib.flaskimportFlaskOpenAPIResponseopenapi_response=FlaskOpenAPIResponse(flask_response)validator=ResponseValidator(spec)result=validator.validate(openapi_request,openapi_response)
Seepyramid_openapi3 project.
This section describes integration withRequests library.
For Requests you can use RequestsOpenAPIRequest a Requests request factory:
fromopenapi_core.validation.request.validatorsimportRequestValidatorfromopenapi_core.contrib.requestsimportRequestsOpenAPIRequestopenapi_request=RequestsOpenAPIRequest(requests_request)validator=RequestValidator(spec)result=validator.validate(openapi_request)
You can use RequestsOpenAPIResponse as a Requests response factory:
fromopenapi_core.validation.response.validatorsimportResponseValidatorfromopenapi_core.contrib.requestsimportRequestsOpenAPIResponseopenapi_response=RequestsOpenAPIResponse(requests_response)validator=ResponseValidator(spec)result=validator.validate(openapi_request,openapi_response)
About
Openapi-core is a Python library that adds client-side and server-side support for the OpenAPI v3.0 and OpenAPI v3.1 specification.
Topics
Resources
License
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Packages0
Uh oh!
There was an error while loading.Please reload this page.