Swagger с django - почему я получаю ошибку отсутствия coreapi.Document?

Я пытаюсь создать красивый пользовательский интерфейс swagger для веб-сервера django, но сталкиваюсь с загадочной ошибкой.

urls.py

from django.urls import path
from djangofun import views
from rest_framework.schemas import get_schema_view
from rest_framework_swagger.renderers import SwaggerUIRenderer, OpenAPIRenderer

schema_view = get_schema_view(title='API', renderer_classes=[OpenAPIRenderer, SwaggerUIRenderer])

urlpatterns = [
    path('', schema_view),
    path('hello/', views.hello)
]

views.py

from django.http import HttpResponse
from django.views.decorators.http import require_http_methods

@require_http_methods(["GET"])
def hello(request):
    return HttpResponse("Hello world")

Ошибка, отображаемая как веб-страница на localhost: The error I get when I load up localhost/

Я не знаю, как исправить эту проблему, возможно, я упускаю что-то очевидное? Документация (которую я нашел) не помогла. Обратите внимание, что если я удалю renderer_classes kwarg из функции get_schema_view, ошибки не будет, но я не получу пользовательский интерфейс swagger, который я ищу.

Traceback:

Environment:


Request Method: GET
Request URL: http://localhost/

Django Version: 4.1
Python Version: 3.9.13
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'rest_framework_swagger']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 220, in _get_response
    response = response.render()
  File "/usr/local/lib/python3.9/site-packages/django/template/response.py", line 114, in render
    self.content = self.rendered_content
  File "/usr/local/lib/python3.9/site-packages/rest_framework/response.py", line 70, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "/usr/local/lib/python3.9/site-packages/rest_framework_swagger/renderers.py", line 54, in render
    self.set_context(data, renderer_context)
  File "/usr/local/lib/python3.9/site-packages/rest_framework_swagger/renderers.py", line 68, in set_context
    renderer_context['spec'] = OpenAPIRenderer().render(
  File "/usr/local/lib/python3.9/site-packages/rest_framework_swagger/renderers.py", line 34, in render
    return OpenAPICodec().encode(data, **options)
  File "/usr/local/lib/python3.9/site-packages/rest_framework_swagger/renderers.py", line 16, in encode
    raise TypeError('Expected a `coreapi.Document` instance')

Exception Type: TypeError at /
Exception Value: Expected a `coreapi.Document` instance

Я решил эту проблему. В конечном итоге, следуя этому руководству.

urls.py

from django.urls import path
from djangofun import views
from rest_framework.schemas import get_schema_view
from django.views.generic import TemplateView

urlpatterns = [
    path('openapi', get_schema_view(
        title="Your Project",
        description="API for all things …",
        version="1.0.0"
    ), name='openapi-schema'),
    path('', TemplateView.as_view(
        template_name='swagger-ui.html',
        extra_context={'schema_url':'openapi-schema'}
    ), name='swagger-ui'),
    path('hello/', views.hello)
]

views.py

from django.http import HttpResponse
from django.views.decorators.http import require_http_methods
from rest_framework.decorators import api_view

@require_http_methods(["GET"])
@api_view()
def hello(request):
    return HttpResponse("Hello world")
Вернуться на верх