Skip to content

Commit

Permalink
Merge pull request #363 from p1c2u/feature/falcon-request-context-ope…
Browse files Browse the repository at this point in the history
…napi

Falcon request openapi context
  • Loading branch information
p1c2u committed Jun 12, 2021
2 parents e4e815f + 64fc1d5 commit 1c2a6d2
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 22 deletions.
17 changes: 17 additions & 0 deletions docs/integrations.rst
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,23 @@ Falcon API can be integrated by `FalconOpenAPIMiddleware` middleware.
openapi_middleware = FalconOpenAPIMiddleware.from_spec(spec)
app = falcon.App(middleware=[openapi_middleware])
After that you will have access to validation result object with all validated request data from Falcon view through request context

.. code-block:: python
class ThingsResource:
def on_get(self, req, resp):
# get parameters object with path, query, cookies and headers parameters
validated_params = req.context.openapi.parameters
# or specific location parameters
validated_path_params = req.context.openapi.parameters.path
# get body
validated_body = req.context.openapi.body
# get security data
validated_security = req.context.openapi.security
Low level
~~~~~~~~~

Expand Down
2 changes: 1 addition & 1 deletion docs/usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ and unmarshal request data from validation result
# get parameters object with path, query, cookies and headers parameters
validated_params = result.parameters
# or specific parameters
# or specific location parameters
validated_path_params = result.parameters.path
# get body
Expand Down
21 changes: 14 additions & 7 deletions openapi_core/contrib/falcon/middlewares.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,18 +47,18 @@ def from_spec(

def process_request(self, req, resp):
openapi_req = self._get_openapi_request(req)
req_result = self.validation_processor.process_request(openapi_req)
if req_result.errors:
return self._handle_request_errors(req, resp, req_result)
req.openapi = req_result
req.context.openapi = self._process_openapi_request(openapi_req)
if req.context.openapi.errors:
return self._handle_request_errors(req, resp, req.context.openapi)

def process_response(self, req, resp, resource, req_succeeded):
openapi_req = self._get_openapi_request(req)
openapi_resp = self._get_openapi_response(resp)
resp_result = self.validation_processor.process_response(
resp.context.openapi = self._process_openapi_response(
openapi_req, openapi_resp)
if resp_result.errors:
return self._handle_response_errors(req, resp, resp_result)
if resp.context.openapi.errors:
return self._handle_response_errors(
req, resp, resp.context.openapi)

def _handle_request_errors(self, req, resp, request_result):
return self.errors_handler.handle(
Expand All @@ -73,3 +73,10 @@ def _get_openapi_request(self, request):

def _get_openapi_response(self, response):
return self.response_factory.create(response)

def _process_openapi_request(self, openapi_request):
return self.validation_processor.process_request(openapi_request)

def _process_openapi_response(self, opneapi_request, openapi_response):
return self.validation_processor.process_response(
opneapi_request, openapi_response)
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

class PetListResource:
def on_get(self, request, response):
assert request.openapi
assert not request.openapi.errors
assert request.openapi.parameters.query == {
assert request.context.openapi
assert not request.context.openapi.errors
assert request.context.openapi.parameters.query == {
'page': 1,
'limit': 12,
'search': '',
Expand All @@ -28,18 +28,18 @@ def on_get(self, request, response):
response.set_header('X-Rate-Limit', '12')

def on_post(self, request, response):
assert request.openapi
assert not request.openapi.errors
assert request.openapi.parameters.cookie == {
assert request.context.openapi
assert not request.context.openapi.errors
assert request.context.openapi.parameters.cookie == {
'user': 1,
}
assert request.openapi.parameters.header == {
assert request.context.openapi.parameters.header == {
'api-key': '12345',
}
assert request.openapi.body.__class__.__name__ == 'PetCreate'
assert request.openapi.body.name == 'Cat'
assert request.openapi.body.ears.__class__.__name__ == 'Ears'
assert request.openapi.body.ears.healthy is True
assert request.context.openapi.body.__class__.__name__ == 'PetCreate'
assert request.context.openapi.body.name == 'Cat'
assert request.context.openapi.body.ears.__class__.__name__ == 'Ears'
assert request.context.openapi.body.ears.healthy is True

response.status = HTTP_201
response.set_header('X-Rate-Limit', '12')
Expand All @@ -48,9 +48,9 @@ def on_post(self, request, response):
class PetDetailResource:
def on_get(self, request, response, petId=None):
assert petId == '12'
assert request.openapi
assert not request.openapi.errors
assert request.openapi.parameters.path == {
assert request.context.openapi
assert not request.context.openapi.errors
assert request.context.openapi.parameters.path == {
'petId': 12,
}
data = {
Expand Down

0 comments on commit 1c2a6d2

Please sign in to comment.