djangodjango-rest-frameworkdrf-yasg

drf-yasg: How to hide Django rest Framework schema?


I use drf_yasg swagger for my Django API. I would like to know how to easily disable the schema and model. screenshot

here is my code:

from .models import Articles
from .serializers import ArticlesSerializer
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import status
from rest_framework.authentication import SessionAuthentication,TokenAuthentication, BasicAuthentication
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.parsers import JSONParser
from django.utils.decorators import method_decorator
from django.contrib.auth import authenticate, login, logout
from rest_framework.decorators import api_view

from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi


@swagger_auto_schema(methods=['get'], operation_description="description", manual_parameters=[
    openapi.Parameter('category', openapi.IN_QUERY, "category1, category2, category3", type=openapi.TYPE_STRING),
    openapi.Parameter('name', openapi.IN_QUERY, "full name", type=openapi.TYPE_STRING),
], responses={
    200: openapi.Response('Response', ArticlesSerializer),
}, tags=['Articles'])

# desactivate POST methode on swagger
@swagger_auto_schema(method='POST', auto_schema=None)

@api_view(['GET','POST'])   
def articles(request):
    """
    List all articles.
    """
    if request.user.is_authenticated:
        if request.method == 'GET':
            articles = Articles.objects.all()
            serializer = ArticlesSerializer(Articles, many=True)
            return JsonResponse(serializer.data, safe=False)

        elif request.method == 'POST':
            data = JSONParser().parse(request)
            serializer = ArticlesSerializer(data=data)
            if serializer.is_valid():
                serializer.save()
                return JsonResponse(serializer.data, status=201)
            return JsonResponse(serializer.errors, status=400)
    return JsonResponse({"status":"403", "message":"User not authenticated"})

If i add this

class UserList(APIView):
swagger_schema = None

i got error:

AssertionError: `method` or `methods` can only be specified on @action or @api_view views

Code Edited: the articles function is pretty simple nothing related to the API, only Python code.

Here the views Class is also pretty simple.

Class Views:

from django.db import models

class Articles(models.Model):
STATUS = (
   (1, 'PENDING'),
   (2, 'COMPLETED'),
   (3, 'DECLINED'),
   (0, 'BANNED'),
)
name = models.CharField(max_length=100)
...
status = models.PositiveSmallIntegerField(
   choices = STATUS,
   default = 1,
)

Solution

  • I finally figured it out. I just had to overwrite the responses parameter with either plain text, markdown or html.

    @swagger_auto_schema(methods=['get'], operation_description="Get article information ", manual_parameters=[
        openapi.Parameter('id', openapi.IN_QUERY, "Article Id", type=openapi.TYPE_STRING),
    ], responses={ 200: '**Example:** \
      <div class="highlight-code"><pre>{  <br>\
      "category": "string", <br>\
      "image": "string",<br>\
      "link": "string",<br>\
      "birth_date": "string",<br>\
    }</pre></div>'},
    tags=['Get Articles'])
    

    To have the same css effect (background black) you can add this custom CSS in the file ...\site-packages\drf_yasg\static\drf-yasg\style.css

    .swagger-ui .markdown .highlight-code pre{
      color: #fff;
      font-weight: 400;
      white-space: pre-wrap;
      background: #41444e;
      padding: 15px;
    }
    

    enter image description here