Package: openapi-django
OpenAPI DjangoБиблиотека для автоматической генерации OpenAPI файла для Django проектов.ИспользованиеУстанавливаем библиотекуpipinstallopenapi-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добавить:fromdjango.contribimportadminfromdjango.urlsimportpath,includeurlpatterns=[path('admin/',admin.site.urls),path('openapi/',include('openapi_django.urls')),]Библиотека добавляет 2 урла:"/" - отображает страницу OpenAPI"/file" - json файл данных OpenAPIИспользованиеПростое добавление информации о запросе без указание возвращаемых и используемых данныхfromdjango.viewsimportViewfromdjango.httpimportHttpResponsefromopenapi_django.openapi_utils.decoratorsimportopenapiclassMyView(View):@openapi()defget(self,request):html="<html>Hello world</html>"returnHttpResponse(html)С указанием используемых данныхПоддерживаются переменные классов "pydantic" и "djantic")importjsonfromtypingimportOptional,Listfromdjango.viewsimportViewfromdjango.httpimportJsonResponsefromdjanticimportModelSchemafrompydantic.mainimportBaseModelfrompydantic.fieldsimportFieldfromopenapi_django.openapi_utils.decoratorsimportopenapifromtest_app.modelsimportMyModelclassMyModelSchema(ModelSchema):classConfig:model=MyModelclassGetReturnClassSchema(BaseModel):data:List[MyModelSchema]=Field(description="Список объектов")classObjectReturnClassSchema(BaseModel):data:MyModelSchema=Field(description="Данные нового объекта")classParametersSchema(BaseModel):name:Optional[str]=Field(description="Имя")color:Optional[str]=Field(description="Любимый цвет")classPostBodySchema(BaseModel):name:str=Field(description="Имя")color:Optional[str]=Field(description="Любимый цвет")classPathParameterSchema(BaseModel):param_path_id:int=Field(description="ID объекта")classPostFileSchema(BaseModel):file:bytesclassMyModelsView(View):@openapi(description="Получение всех обьектов",return_class=GetReturnClassSchema,parameters=ParametersSchema)defget(self,request):items=MyModel.objects.filter(**request.GET.dict())returnJsonResponse(data={"data":[MyModelSchema.from_orm(item).dict()foriteminitems]})@openapi(description="Добавление обьекта",return_class=ObjectReturnClassSchema,body=PostBodySchema)defpost(self,request):item=MyModel(**json.loads(request.body))item.save()returnJsonResponse(data={"data":MyModelSchema.from_orm(item).dict()})classMyModelPathView(View):@openapi(description="Получение данных объекта",return_class=ObjectReturnClassSchema,path_parameters=PathParameterSchema)defget(self,request,param_path_id):item=MyModel.objects.get(pk=param_path_id)returnJsonResponse(data={"data":MyModelSchema.from_orm(item).dict()})classMyModelFileView(View):@openapi(description="Отправка файла",answer_content="multipart/form-data",body=PostFileSchema)defpost(self,request):content=request.FILES.get("file").read().decode('utf8')returnJsonResponse(data={"msg":'OK'})