Skip to content

Commit 64fc1d5

Browse files
committed
Falcon request openapi context
1 parent e4e815f commit 64fc1d5

File tree

4 files changed

+46
-22
lines changed

4 files changed

+46
-22
lines changed

docs/integrations.rst

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,23 @@ Falcon API can be integrated by `FalconOpenAPIMiddleware` middleware.
7474
openapi_middleware = FalconOpenAPIMiddleware.from_spec(spec)
7575
app = falcon.App(middleware=[openapi_middleware])
7676
77+
After that you will have access to validation result object with all validated request data from Falcon view through request context
78+
79+
.. code-block:: python
80+
81+
class ThingsResource:
82+
def on_get(self, req, resp):
83+
# get parameters object with path, query, cookies and headers parameters
84+
validated_params = req.context.openapi.parameters
85+
# or specific location parameters
86+
validated_path_params = req.context.openapi.parameters.path
87+
88+
# get body
89+
validated_body = req.context.openapi.body
90+
91+
# get security data
92+
validated_security = req.context.openapi.security
93+
7794
Low level
7895
~~~~~~~~~
7996

docs/usage.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ and unmarshal request data from validation result
3838
3939
# get parameters object with path, query, cookies and headers parameters
4040
validated_params = result.parameters
41-
# or specific parameters
41+
# or specific location parameters
4242
validated_path_params = result.parameters.path
4343
4444
# get body

openapi_core/contrib/falcon/middlewares.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,18 @@ def from_spec(
4747

4848
def process_request(self, req, resp):
4949
openapi_req = self._get_openapi_request(req)
50-
req_result = self.validation_processor.process_request(openapi_req)
51-
if req_result.errors:
52-
return self._handle_request_errors(req, resp, req_result)
53-
req.openapi = req_result
50+
req.context.openapi = self._process_openapi_request(openapi_req)
51+
if req.context.openapi.errors:
52+
return self._handle_request_errors(req, resp, req.context.openapi)
5453

5554
def process_response(self, req, resp, resource, req_succeeded):
5655
openapi_req = self._get_openapi_request(req)
5756
openapi_resp = self._get_openapi_response(resp)
58-
resp_result = self.validation_processor.process_response(
57+
resp.context.openapi = self._process_openapi_response(
5958
openapi_req, openapi_resp)
60-
if resp_result.errors:
61-
return self._handle_response_errors(req, resp, resp_result)
59+
if resp.context.openapi.errors:
60+
return self._handle_response_errors(
61+
req, resp, resp.context.openapi)
6262

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

7474
def _get_openapi_response(self, response):
7575
return self.response_factory.create(response)
76+
77+
def _process_openapi_request(self, openapi_request):
78+
return self.validation_processor.process_request(openapi_request)
79+
80+
def _process_openapi_response(self, opneapi_request, openapi_response):
81+
return self.validation_processor.process_response(
82+
opneapi_request, openapi_response)

tests/integration/contrib/falcon/data/v3.0/falconproject/pets/resources.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66

77
class PetListResource:
88
def on_get(self, request, response):
9-
assert request.openapi
10-
assert not request.openapi.errors
11-
assert request.openapi.parameters.query == {
9+
assert request.context.openapi
10+
assert not request.context.openapi.errors
11+
assert request.context.openapi.parameters.query == {
1212
'page': 1,
1313
'limit': 12,
1414
'search': '',
@@ -28,18 +28,18 @@ def on_get(self, request, response):
2828
response.set_header('X-Rate-Limit', '12')
2929

3030
def on_post(self, request, response):
31-
assert request.openapi
32-
assert not request.openapi.errors
33-
assert request.openapi.parameters.cookie == {
31+
assert request.context.openapi
32+
assert not request.context.openapi.errors
33+
assert request.context.openapi.parameters.cookie == {
3434
'user': 1,
3535
}
36-
assert request.openapi.parameters.header == {
36+
assert request.context.openapi.parameters.header == {
3737
'api-key': '12345',
3838
}
39-
assert request.openapi.body.__class__.__name__ == 'PetCreate'
40-
assert request.openapi.body.name == 'Cat'
41-
assert request.openapi.body.ears.__class__.__name__ == 'Ears'
42-
assert request.openapi.body.ears.healthy is True
39+
assert request.context.openapi.body.__class__.__name__ == 'PetCreate'
40+
assert request.context.openapi.body.name == 'Cat'
41+
assert request.context.openapi.body.ears.__class__.__name__ == 'Ears'
42+
assert request.context.openapi.body.ears.healthy is True
4343

4444
response.status = HTTP_201
4545
response.set_header('X-Rate-Limit', '12')
@@ -48,9 +48,9 @@ def on_post(self, request, response):
4848
class PetDetailResource:
4949
def on_get(self, request, response, petId=None):
5050
assert petId == '12'
51-
assert request.openapi
52-
assert not request.openapi.errors
53-
assert request.openapi.parameters.path == {
51+
assert request.context.openapi
52+
assert not request.context.openapi.errors
53+
assert request.context.openapi.parameters.path == {
5454
'petId': 12,
5555
}
5656
data = {

0 commit comments

Comments
 (0)