OpenAPI (v3) schema generation via Pydantic models using Django REST Framework.
Project description
Generate OpenAPI schema with DRF code using pydantic models. Supports referencing other service's components.
Usage
Add urls to the project
urlpatters = [
path("openapi/", include("drf_pydantic_openapi.urls")),
]
- Available endpoints
/schema.json
/docs
/redoc
Reference OpenAPI source
Add the following setting to your projects settings.py
. This will allow the module to access to the other OpenAPI components defined in seperate projects.
# settings.py
DRF_PYDANTIC_OPENAPI = {
"REF_SOURCES": {
"service_B": "http://localhost:8000/openapi",
"service_C": "http://localhost:8001/openapi",
}
}
Using a component defined in another service
# views.py
from drf_pydantic_openapi.ref_utils import RefType
BookModel = RefType("service_B", "BookModel")
class BookView(ApiView):
def get(self, request) -> BookModel:
...
# More complex example
class CustomBookModel(RefType("service_B", "BookModel")):
# add new field
read_count: int
class Config:
# Remove field from referenced type
ref_exclude = ("author",)
# Rename field
ref_rename = (("book_name", "name"),)
class PaginatedBookModel(BaseModel):
total: int
next: str
prev: str
data: list[CustomBookModel]
class BookView(ApiView):
def get(self, request) -> PaginatedBookModel:
...
Using the @docs
- Parameters
- body: Request body model
- errors: List of error models
- query: Query model
- path: Api path parameter model
from pydantic import BaseModel
from drf_pydantic_openapi.errors import BadRequestError, NotFoundError
class RetrieveQuery(BaseModel):
book_id: str
class Path(BaseModel):
book_id: str = Field(description="Book id to retrieve")
class BookView(ApiView):
@docs(errors=[NotFoundError], query=RetrieveQuery, path=Path)
def get(self, request):
...
...
Typed exception handler
Assign the typed_exception_handler
to rest framework. This will catch any ValidationError and the custom HttpError and return the response as json.
# settings.py
REST_FRAMEWORK = {
"EXCEPTION_HANDLER": "drf_pydantic_openapi.exception_handler.typed_exception_handler"
}
# Example
from drf_pydantic_openapi.errors import BadRequestError
class SomeView(ApiView):
@docs(errors=[BadRequestError])
def post(self, request):
raise BadRequestError()
Response
{
"detail": {
"message": "Bad request"
}
}
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
drf_pydantic_openapi-0.6.1.tar.gz
(930.9 kB
view hashes)
Built Distribution
Close
Hashes for drf_pydantic_openapi-0.6.1.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 608996efb104ab3836d72612b3ab9577441a87d14f4060118fe2263c3b64779d |
|
MD5 | 7a71a5db6b3139cad51a03af2c0bbf0f |
|
BLAKE2b-256 | 2de999d6052bb35f727421aedf61208fce1e995caf5a77cf2984e7b1371966c1 |
Close
Hashes for drf_pydantic_openapi-0.6.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2367452ff51f0b52e59186e789216764a69914e9ca57b372c7a97aa6000607de |
|
MD5 | 18a5c01617466bfec7374a8b77b74a4d |
|
BLAKE2b-256 | 78a5cbcb5322f484cc6bdeefafd87030222e6147ac5b494123fcff393d51f254 |