drf自动生成API文档

REST framework可以自动帮助我们生成接口文档。

接口文档以网页的方式呈现。

自动接口文档能生成的是继承自APIView及其子类的视图。

1.安装依赖

REST FRAMEWORK 生成接口文档需要coreapi的支持

pip install coreapi

2.设置接口文档访问路径

在总路由中添加接口文档路径。

文档路由对应的视图配置为rest_framework.documentation.include_docs_urls

参数title为接口文档网站的标题。

# 在总路由中配置

from rest_framework.documentation import include_docs_urls
urlpatterns = [
        ...
        path('docs/', include_docs_urls(title='xxx站点标题'))
    ]

访问 http://127.0.0.1:8000/docs/ ,如果进入docs报了下面的错误,说明我们缺少一个依赖,

'AutoSchema' object has no attribute 'get_link'

在setting中配置如下:

REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
}

3.文档描述说明的定义位置

单一方法的视图,可直接使用类视图的文档字符串,如

class BookListView(generics.ListAPIView):
        """
        返回所有图书信息.
        """

包含多个方法的视图,在类视图的文档字符串中,分开方法定义,如

class BookListCreateView(generics.ListCreateAPIView):
        """
        get:
        返回所有图书信息.

        post:
        新建图书
        """

对于视图集ViewSet,仍在类视图的文档字符串中封开定义,但是应使用action名称区分,如

class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
        """
        list:
        返回图书列表数据
        retrieve:
        返回图书详情数据
        latest:
        返回最新的图书数据
        read:
        修改图书的阅读量
        """

基于APIView的接口,定义在对应的方法下面,如:

class BookAPIView(APIView):
        def get(self, request, *args, **kwargs):
            '''
            get查所有的接口文档
            '''
            book = models.Book.objects.all()
            book_ser = BookModelSerializer(instance=book, many=True)
            return Response(book_ser.data)

        def post(self, request, *args, **kwargs):
            '''
            post添加数据接口
            '''
            book = models.Book.objects.all()
            book_ser = BookModelSerializer(instance=book, data=request.data)
            if book_ser.is_valid():
                book_ser.save()
                return Response(book_ser.data)

4.访问接口文档网页

浏览器访问 127.0.0.1:8000/docs/,即可看到自动生成的接口文档。

两点说明

1) 视图集ViewSet中的retrieve名称,在接口文档网站中叫做read
2)参数的Description需要在模型类或序列化器类的字段中以help_text选项定义,如:

# models.py
    
class Student(models.Model):
        ...
        age = models.IntegerField(default=0, verbose_name='年龄', help_text='年龄')
        ...

注意,如果你多个应用使用同一个序列化器,可能会导致help_text的内容显示有些问题,

class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = "__all__"
        extra_kwargs = {
            'age': {
                'required': True,
                'help_text': '年龄'
            }
        }

 

 

posted @ 2022-05-22 15:38  _yessir  阅读(113)  评论(0编辑  收藏  举报