Skip to main content

OpenApi for django

Project description

OpenAPI Django

Библиотека для автоматической генерации OpenAPI файла для Django проектов.

Использование

Устанавливаем библиотеку

pip install openapi-django

Добавляем в проект

В файле {ProjectPath}/{DjangoFolder}/settings.py находим секцию INSTALLED_APPS и добавляем имя библиотеки.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'openapi_django'
]

Настройка

Настройка производится добавлением словаря OPENAPI_DJANGO в файл {ProjectPath}/{DjangoFolder}/settings.py

Используемые ключи:

  • servers - Список серверов, которые нужно добавить на страницу OpenAPI (Учитывайте что если в settings.py указано DEBUG = True то на страницу автоматически будет добавлен сервер из request.META["HTTP_HOST"] запроса)
  • version - Версия вашего приложения
  • title - Имя приложения

Пример:

OPENAPI_DJANGO = {
    "servers": ["https://test.test"],
    "version": "0.0.1",
    "title": "Test project"
}

Добавление url для отображения страницы OpenAPI

В файле {ProjectPath}/{DjangoFolder}/urls.py добавить:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('openapi/', include('openapi_django.urls')),
]

Библиотека добавляет 2 урла:

  1. "/" - отображает страницу OpenAPI
  2. "/file" - json файл данных OpenAPI

Использование

Простое добавление информации о запросе без указание возвращаемых и используемых данных

from django.views import View
from django.http import HttpResponse

from openapi_django.openapi_utils.decorators import openapi

class MyView(View):
    @openapi()
    def get(self, request):
        html = "<html>Hello world</html>"
        return HttpResponse(html)

С указанием используемых данных

Поддерживаются переменные классов "pydantic" и "djantic")

import json
from typing import Optional, List
from django.views import View
from django.http import JsonResponse
from djantic import ModelSchema
from pydantic.main import BaseModel
from pydantic.fields import Field

from openapi_django.openapi_utils.decorators import openapi

from test_app.models import MyModel


class MyModelSchema(ModelSchema):
    class Config:
        model = MyModel


class GetReturnClassSchema(BaseModel):
    data: List[MyModelSchema] = Field(description="Список объектов")


class ObjectReturnClassSchema(BaseModel):
    data: MyModelSchema = Field(description="Данные нового объекта")


class ParametersSchema(BaseModel):
    name: Optional[str] = Field(description="Имя")
    color: Optional[str] = Field(description="Любимый цвет")


class PostBodySchema(BaseModel):
    name: str = Field(description="Имя")
    color: Optional[str] = Field(description="Любимый цвет")


class PathParameterSchema(BaseModel):
    param_path_id: int = Field(description="ID объекта")
    
class PostFileSchema(BaseModel):
    file: bytes


class MyModelsView(View):
    @openapi(
        description="Получение всех обьектов",
        return_class=GetReturnClassSchema,
        parameters=ParametersSchema)
    def get(self, request):
        items = MyModel.objects.filter(**request.GET.dict())
        return JsonResponse(data={"data": [MyModelSchema.from_orm(item).dict() for item in items]})

    @openapi(
        description="Добавление обьекта",
        return_class=ObjectReturnClassSchema,
        body=PostBodySchema
    )
    def post(self, request):
        item = MyModel(**json.loads(request.body))
        item.save()
        return JsonResponse(data={"data": MyModelSchema.from_orm(item).dict()})


class MyModelPathView(View):
    @openapi(
        description="Получение данных объекта",
        return_class=ObjectReturnClassSchema,
        path_parameters=PathParameterSchema
    )
    def get(self, request, param_path_id):
        item = MyModel.objects.get(pk=param_path_id)
        return JsonResponse(data={"data": MyModelSchema.from_orm(item).dict()})

class MyModelFileView(View):
    @openapi(
        description="Отправка файла",
        answer_content="multipart/form-data",
        body=PostFileSchema
    )
    def post(self, request):
        content = request.FILES.get("file").read().decode('utf8')
        return JsonResponse(data={"msg": 'OK'})

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

openapi_django-1.4.1.tar.gz (34.8 kB view details)

Uploaded Source

Built Distribution

openapi_django-1.4.1-py3-none-any.whl (41.9 kB view details)

Uploaded Python 3

File details

Details for the file openapi_django-1.4.1.tar.gz.

File metadata

  • Download URL: openapi_django-1.4.1.tar.gz
  • Upload date:
  • Size: 34.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.1

File hashes

Hashes for openapi_django-1.4.1.tar.gz
Algorithm Hash digest
SHA256 02d413f8c3998cea1f5a54176da2af3112c55b953e916e7800833aa6f618c89a
MD5 72cb36a66af08d460b93647e1c54864f
BLAKE2b-256 852116ea620323099d0aa6c684e8ca736df75f6ecc9d34687901f929ddb3a3f2

See more details on using hashes here.

File details

Details for the file openapi_django-1.4.1-py3-none-any.whl.

File metadata

File hashes

Hashes for openapi_django-1.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 8be390904566572d9988930c62ff648efdb9c145148f46f5ca54e20b6ac55133
MD5 1f5d0da82b59fb9a6a7bb4c3d7731b58
BLAKE2b-256 e4f75a8d8925217b73d89e35eb4178aaef3346a083ad146f7c2b426d52961f6c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page