Skip to content

Commit 8365e5c

Browse files
authored
Merge pull request #739 from python-openapi/feature/docs-integrations-restructure-2
Docs integrations restructure
2 parents 116617d + d8c54dc commit 8365e5c

File tree

8 files changed

+167
-100
lines changed

8 files changed

+167
-100
lines changed

docs/api.rst

Lines changed: 0 additions & 5 deletions
This file was deleted.

docs/index.rst

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ openapi-core
1212
security
1313
extensions
1414
contributing
15-
api
1615

1716
Openapi-core is a Python library that adds client-side and server-side support
1817
for the `OpenAPI v3.0 <https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md>`__

docs/integrations/aiohttp.rst

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,36 @@ This section describes integration with `aiohttp.web <https://docs.aiohttp.org/e
66
Low level
77
---------
88

9-
You can use ``AIOHTTPOpenAPIWebRequest`` as an aiohttp request factory:
9+
The integration defines classes useful for low level integration.
10+
11+
Request
12+
^^^^^^^
13+
14+
Use ``AIOHTTPOpenAPIWebRequest`` to create OpenAPI request from aiohttp.web request:
1015

1116
.. code-block:: python
1217
1318
from openapi_core.contrib.aiohttp import AIOHTTPOpenAPIWebRequest
1419
15-
request_body = await aiohttp_request.text()
16-
openapi_request = AIOHTTPOpenAPIWebRequest(aiohttp_request, body=request_body)
17-
result = openapi.unmarshal_request(openapi_request)
20+
async def hello(request):
21+
request_body = await request.text()
22+
openapi_request = AIOHTTPOpenAPIWebRequest(request, body=request_body)
23+
openapi.validate_request(openapi_request)
24+
return web.Response(text="Hello, world")
25+
26+
Response
27+
^^^^^^^^
1828

19-
You can use ``AIOHTTPOpenAPIWebRequest`` as an aiohttp response factory:
29+
Use ``AIOHTTPOpenAPIWebResponse`` to create OpenAPI response from aiohttp.web response:
2030

2131
.. code-block:: python
2232
23-
from openapi_core.contrib.starlette import AIOHTTPOpenAPIWebRequest
33+
from openapi_core.contrib.starlette import AIOHTTPOpenAPIWebResponse
2434
25-
openapi_response = StarletteOpenAPIResponse(aiohttp_response)
26-
result = openapi.unmarshal_response(openapi_request, openapi_response)
35+
async def hello(request):
36+
request_body = await request.text()
37+
response = web.Response(text="Hello, world")
38+
openapi_request = AIOHTTPOpenAPIWebRequest(request, body=request_body)
39+
openapi_response = AIOHTTPOpenAPIWebResponse(response)
40+
result = openapi.unmarshal_response(openapi_request, openapi_response)
41+
return response

docs/integrations/django.rst

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ The integration supports Django from version 3.0 and above.
77
Middleware
88
----------
99

10-
Django can be integrated by middleware. Add ``DjangoOpenAPIMiddleware`` to your ``MIDDLEWARE`` list and define ``OPENAPI``.
10+
Django can be integrated by `middleware <https://docs.djangoproject.com/en/5.0/topics/http/middleware/>`__ to apply OpenAPI validation to your entire application.
11+
12+
Add ``DjangoOpenAPIMiddleware`` to your ``MIDDLEWARE`` list and define ``OPENAPI``.
1113

1214
.. code-block:: python
1315
:emphasize-lines: 6,9
@@ -22,6 +24,30 @@ Django can be integrated by middleware. Add ``DjangoOpenAPIMiddleware`` to your
2224
2325
OPENAPI = OpenAPI.from_dict(spec_dict)
2426
27+
After that all your requests and responses will be validated.
28+
29+
Also you have access to unmarshal result object with all unmarshalled request data through ``openapi`` attribute of request object.
30+
31+
.. code-block:: python
32+
33+
from django.views import View
34+
35+
class MyView(View):
36+
def get(self, request):
37+
# get parameters object with path, query, cookies and headers parameters
38+
unmarshalled_params = request.openapi.parameters
39+
# or specific location parameters
40+
unmarshalled_path_params = request.openapi.parameters.path
41+
42+
# get body
43+
unmarshalled_body = request.openapi.body
44+
45+
# get security data
46+
unmarshalled_security = request.openapi.security
47+
48+
Response validation
49+
^^^^^^^^^^^^^^^^^^^
50+
2551
You can skip response validation process: by setting ``OPENAPI_RESPONSE_CLS`` to ``None``
2652

2753
.. code-block:: python
@@ -38,43 +64,38 @@ You can skip response validation process: by setting ``OPENAPI_RESPONSE_CLS`` to
3864
OPENAPI = OpenAPI.from_dict(spec_dict)
3965
OPENAPI_RESPONSE_CLS = None
4066
41-
After that you have access to unmarshal result object with all validated request data from Django view through request object.
42-
43-
.. code-block:: python
44-
45-
from django.views import View
46-
47-
class MyView(View):
48-
def get(self, req):
49-
# get parameters object with path, query, cookies and headers parameters
50-
validated_params = req.openapi.parameters
51-
# or specific location parameters
52-
validated_path_params = req.openapi.parameters.path
53-
54-
# get body
55-
validated_body = req.openapi.body
56-
57-
# get security data
58-
validated_security = req.openapi.security
59-
6067
Low level
6168
---------
6269

63-
You can use ``DjangoOpenAPIRequest`` as a Django request factory:
70+
The integration defines classes useful for low level integration.
71+
72+
Request
73+
^^^^^^^
74+
75+
Use ``DjangoOpenAPIRequest`` to create OpenAPI request from Django request:
6476

6577
.. code-block:: python
6678
6779
from openapi_core.contrib.django import DjangoOpenAPIRequest
6880
69-
openapi_request = DjangoOpenAPIRequest(django_request)
70-
result = openapi.unmarshal_request(openapi_request)
81+
class MyView(View):
82+
def get(self, request):
83+
openapi_request = DjangoOpenAPIRequest(request)
84+
openapi.validate_request(openapi_request)
85+
86+
Response
87+
^^^^^^^^
7188

72-
You can use ``DjangoOpenAPIResponse`` as a Django response factory:
89+
Use ``DjangoOpenAPIResponse`` to create OpenAPI response from Django response:
7390

7491
.. code-block:: python
7592
7693
from openapi_core.contrib.django import DjangoOpenAPIResponse
7794
78-
openapi_response = DjangoOpenAPIResponse(django_response)
79-
result = openapi.unmarshal_response(openapi_request, openapi_response)
80-
95+
class MyView(View):
96+
def get(self, request):
97+
response = JsonResponse({'hello': 'world'})
98+
openapi_request = DjangoOpenAPIRequest(request)
99+
openapi_response = DjangoOpenAPIResponse(response)
100+
openapi.validate_response(openapi_request, openapi_response)
101+
return response

docs/integrations/flask.rst

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,34 @@ Flask
33

44
This section describes integration with `Flask <https://flask.palletsprojects.com>`__ web framework.
55

6-
Decorator
7-
---------
6+
View decorator
7+
--------------
8+
9+
Flask can be integrated by `view decorator <https://flask.palletsprojects.com/en/latest/patterns/viewdecorators/>`__ to apply OpenAPI validation to your application's specific views.
810

9-
Flask views can be integrated by ``FlaskOpenAPIViewDecorator`` decorator.
11+
Use ``FlaskOpenAPIViewDecorator`` with OpenAPI object to create the decorator.
1012

1113
.. code-block:: python
1214
:emphasize-lines: 1,3,6
1315
1416
from openapi_core.contrib.flask.decorators import FlaskOpenAPIViewDecorator
1517
16-
openapi = FlaskOpenAPIViewDecorator.from_spec(spec)
18+
openapi_validated = FlaskOpenAPIViewDecorator(openapi)
1719
1820
@app.route('/home')
19-
@openapi
21+
@openapi_validated
2022
def home():
2123
return "Welcome home"
2224
23-
Additional customization parameters can be passed to the decorator.
24-
25-
.. code-block:: python
26-
:emphasize-lines: 5
27-
28-
from openapi_core.contrib.flask.decorators import FlaskOpenAPIViewDecorator
29-
30-
openapi = FlaskOpenAPIViewDecorator.from_spec(
31-
spec,
32-
extra_format_validators=extra_format_validators,
33-
)
34-
3525
You can skip response validation process: by setting ``response_cls`` to ``None``
3626

3727
.. code-block:: python
3828
:emphasize-lines: 5
3929
4030
from openapi_core.contrib.flask.decorators import FlaskOpenAPIViewDecorator
4131
42-
openapi = FlaskOpenAPIViewDecorator.from_spec(
43-
spec,
32+
openapi_validated = FlaskOpenAPIViewDecorator(
33+
openapi,
4434
response_cls=None,
4535
)
4636
@@ -50,7 +40,7 @@ If you want to decorate class based view you can use the decorators attribute:
5040
:emphasize-lines: 2
5141
5242
class MyView(View):
53-
decorators = [openapi]
43+
decorators = [openapi_validated]
5444
5545
def dispatch_request(self):
5646
return "Welcome home"

docs/integrations/requests.rst

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,47 @@ This section describes integration with `Requests <https://requests.readthedocs.
66
Low level
77
---------
88

9-
You can use ``RequestsOpenAPIRequest`` as a Requests request factory:
9+
The integration defines classes useful for low level integration.
10+
11+
Request
12+
^^^^^^^
13+
14+
Use ``RequestsOpenAPIRequest`` to create OpenAPI request from Requests request:
1015

1116
.. code-block:: python
1217
1318
from openapi_core.contrib.requests import RequestsOpenAPIRequest
1419
15-
openapi_request = RequestsOpenAPIRequest(requests_request)
16-
result = openapi.unmarshal_request(openapi_request)
20+
request = Request('POST', url, data=data, headers=headers)
21+
openapi_request = RequestsOpenAPIRequest(request)
22+
openapi.validate_request(openapi_request)
1723
18-
You can use ``RequestsOpenAPIResponse`` as a Requests response factory:
24+
Webhook request
25+
^^^^^^^^^^^^^^^
26+
27+
Use ``RequestsOpenAPIWebhookRequest`` to create OpenAPI webhook request from Requests request:
1928

2029
.. code-block:: python
2130
22-
from openapi_core.contrib.requests import RequestsOpenAPIResponse
31+
from openapi_core.contrib.requests import RequestsOpenAPIWebhookRequest
2332
24-
openapi_response = RequestsOpenAPIResponse(requests_response)
25-
result = openapi.unmarshal_response(openapi_request, openapi_response)
33+
request = Request('POST', url, data=data, headers=headers)
34+
openapi_webhook_request = RequestsOpenAPIWebhookRequest(request, "my_webhook")
35+
openapi.validate_request(openapi_webhook_request)
2636
37+
Response
38+
^^^^^^^^
2739

28-
You can use ``RequestsOpenAPIWebhookRequest`` as a Requests webhook request factory:
40+
Use ``RequestsOpenAPIResponse`` to create OpenAPI response from Requests response:
2941

3042
.. code-block:: python
3143
32-
from openapi_core.contrib.requests import RequestsOpenAPIWebhookRequest
44+
from openapi_core.contrib.requests import RequestsOpenAPIResponse
3345
34-
openapi_webhook_request = RequestsOpenAPIWebhookRequest(requests_request, "my_webhook")
35-
result = openapi.unmarshal_request(openapi_webhook_request)
46+
session = Session()
47+
request = Request('POST', url, data=data, headers=headers)
48+
prepped = session.prepare_request(req)
49+
response = session,send(prepped)
50+
openapi_request = RequestsOpenAPIRequest(request)
51+
openapi_response = RequestsOpenAPIResponse(response)
52+
openapi.validate_response(openapi_request, openapi_response)

docs/integrations/starlette.rst

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ This section describes integration with `Starlette <https://www.starlette.io>`__
66
Middleware
77
----------
88

9-
Starlette can be integrated by middleware. Add ``StarletteOpenAPIMiddleware`` with ``spec`` to your ``middleware`` list.
9+
Starlette can be integrated by `middleware <https://www.starlette.io/middleware/>`__ to apply OpenAPI validation to your entire application.
10+
11+
Add ``StarletteOpenAPIMiddleware`` with OpenAPI object to your ``middleware`` list.
1012

1113
.. code-block:: python
1214
:emphasize-lines: 1,6
@@ -24,21 +26,26 @@ Starlette can be integrated by middleware. Add ``StarletteOpenAPIMiddleware`` wi
2426
middleware=middleware,
2527
)
2628
27-
After that you have access to unmarshal result object with all validated request data from endpoint through ``openapi`` key of request's scope directory.
29+
After that all your requests and responses will be validated.
30+
31+
Also you have access to unmarshal result object with all unmarshalled request data through ``openapi`` scope of request object.
2832

2933
.. code-block:: python
3034
31-
async def get_endpoint(req):
35+
async def homepage(request):
3236
# get parameters object with path, query, cookies and headers parameters
33-
validated_params = req.scope["openapi"].parameters
37+
unmarshalled_params = request.scope["openapi"].parameters
3438
# or specific location parameters
35-
validated_path_params = req.scope["openapi"].parameters.path
39+
unmarshalled_path_params = request.scope["openapi"].parameters.path
3640
3741
# get body
38-
validated_body = req.scope["openapi"].body
42+
unmarshalled_body = request.scope["openapi"].body
3943
4044
# get security data
41-
validated_security = req.scope["openapi"].security
45+
unmarshalled_security = request.scope["openapi"].security
46+
47+
Response validation
48+
^^^^^^^^^^^^^^^^^^^
4249

4350
You can skip response validation process: by setting ``response_cls`` to ``None``
4451

@@ -57,20 +64,34 @@ You can skip response validation process: by setting ``response_cls`` to ``None`
5764
Low level
5865
---------
5966

60-
You can use ``StarletteOpenAPIRequest`` as a Starlette request factory:
67+
The integration defines classes useful for low level integration.
68+
69+
Request
70+
^^^^^^^
71+
72+
Use ``StarletteOpenAPIRequest`` to create OpenAPI request from Starlette request:
6173

6274
.. code-block:: python
6375
6476
from openapi_core.contrib.starlette import StarletteOpenAPIRequest
6577
66-
openapi_request = StarletteOpenAPIRequest(starlette_request)
67-
result = openapi.unmarshal_request(openapi_request)
78+
async def homepage(request):
79+
openapi_request = StarletteOpenAPIRequest(request)
80+
result = openapi.unmarshal_request(openapi_request)
81+
return JSONResponse({'hello': 'world'})
82+
83+
Response
84+
^^^^^^^^
6885

69-
You can use ``StarletteOpenAPIResponse`` as a Starlette response factory:
86+
Use ``StarletteOpenAPIResponse`` to create OpenAPI response from Starlette response:
7087

7188
.. code-block:: python
7289
7390
from openapi_core.contrib.starlette import StarletteOpenAPIResponse
7491
75-
openapi_response = StarletteOpenAPIResponse(starlette_response)
76-
result = openapi.unmarshal_response(openapi_request, openapi_response)
92+
async def homepage(request):
93+
response = JSONResponse({'hello': 'world'})
94+
openapi_request = StarletteOpenAPIRequest(request)
95+
openapi_response = StarletteOpenAPIResponse(response)
96+
openapi.validate_response(openapi_request, openapi_response)
97+
return response

0 commit comments

Comments
 (0)