Skip to content

Falcon request openapi context #363

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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