Home >Backend Development >Python Tutorial >Django Rest framework with Swagger

Django Rest framework with Swagger

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-30 05:37:13928browse

What to expect from this article?

This article will cover implementing Swagger in a Django rest framework project; we will work on our accounts management

Series order

Check previous articles if interested!

  1. AI Project from Scratch, The Idea, Alive Diary
  2. Prove it is feasible with Google AI Studio
  3. Django API Project Setup
  4. Django accounts management (1), registration and activation
  5. Django accounts management (2), login and change password
  6. Swagger with Django rest framework (You are here ?)

Installation and setup

The best swagger generator I found for rest-framework is drf-yasg, but I'm open to suggestions if you know a better one!
Let's start with package installation

pip install drf-yasg

now moving to our setting file

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'drf_yasg', #new
    'corsheaders',
    'rest_framework',
    'django_filters',
    'app_account',
    'app_admin',
    'app_main',
]

SWAGGER_SETTINGS = {
   'LOGIN_URL' : '/api/account/login/',
   'SECURITY_DEFINITIONS': {
      'Bearer': {
            'type': 'apiKey',
            'name': 'Authorization',
            'in': 'header'
      }
   }
}

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema'
}

alive_diary/settings.py

We have added the drf_yasg app to the installed apps and set the default authentication method to Bearer JWT token.

now to the URLs file

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


from rest_framework.documentation import include_docs_urls # new
from rest_framework.schemas import get_schema_view # new

from drf_yasg.views import get_schema_view # new
from drf_yasg import openapi # new

schema_view = get_schema_view(
    openapi.Info(
        title="Swagger API",
        default_version='v1',
    ),
    public=True,
)
API_DESCRIPTION = 'A Web API for creating and editing.' # new
API_TITLE = 'API' # new

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/account/', include('app_account.urls')),

    path('docs/', include_docs_urls(title=API_TITLE,description=API_DESCRIPTION)), # new
    path('swagger/', schema_view.with_ui('swagger',cache_timeout=0),name="swagger-schema"), # new
]

that is it! great job!
let's try it

python manage.py runserver 0.0.0.0:8555 

opening http://localhost:8555/swagger/ should look like

Django Rest framework with Swagger

Testing Swagger with custom ApiView

let's start by logging in using the login API view in swagger

Django Rest framework with Swagger

Then, we authenticate using the "Authorize" button at the top of the swagger page. Make sure to use the access token, and don't forget the Bearer in front of it: "Bearer token..."

Django Rest framework with Swagger

let's try changing the password using Swagger

Django Rest framework with Swagger

it is empty! swagger wasn't able to recognize request schema, the easiest way to fit it is to use swagger auto schema

from drf_yasg.utils import swagger_auto_schema #new


class AccountChangePasswordView(APIView):
    permission_classes = (IsAuthenticated,)
    renderer_classes = [CustomRenderer, BrowsableAPIRenderer]

    @swagger_auto_schema(request_body=ChangePasswordSerializer) # new
    def post(self, request, *args, **kwargs):
        serializer = ChangePasswordSerializer(data=request.data)

        if not serializer.is_valid():
            raise APIException(serializer.errors)

        user = request.user
        password = serializer.validated_data.get("password")
        new_password = serializer.validated_data.get("new_password")

        if not user.check_password(password):
            raise APIException("invalid_password")

        user.set_password(new_password)
        user.save()

        return Response("success")

it looks good now

Django Rest framework with Swagger

we can test all authenticated requests using Swagger now! next article will go back to the accounts app

Stay tuned ?

The above is the detailed content of Django Rest framework with Swagger. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn