django rest_framework 自定义文档

21 篇文章 2 订阅
20 篇文章 0 订阅

简介

django rest_framework 自动生成文档的功能,能够很好的给前端提供帮助,在文档中可以看到api的参数和其提供的功能信息,并且还能够在上面直接测试api接口。

官网

配置

urls.py

from rest_framework.documentation import include_docs_urls

urlpatterns = [
    ...
    url(r'^docs/', include_docs_urls(title='My API title'))]

即可使用该url对文档的访问

自定义文档

虽然可以自动生成文档,但是不是很完善,所以需要自定义写文档。

schema

通过改写AutoSchema来完成自定义文档。

实现

方法一

get_linkAutoSchema中的函数. 重写get_link函数,对文档中的每个字段的说明进行改写。

集成AutoSchema,在__init__初始化params_desc_dict参数,该参数包含文档中字段对应的注释,然后在get_link对该参数进行解析,并替换字段注释.

class BaseSchema(AutoSchema):
    """
    自动生成的文档会有缺失,或者是因为可读性比较差。所以需要对文档中的字段进行自定义注解。
    该类是通用的对文档中的get、post、put、delete、patch进行注释。
    是在已有字段的基础上修改注释.
    
    `get`是对get中的字段进行注解说明。
    `other`是`post`、`put`、`delete`、`patch`
    
    例子:
        {
            "get": {
                "字段名": "对该字段进行注释"
            },
            "post": {
                "字段名": "对该字段进行注释"
            }
        }

    """
    def __init__(self, manual_fields=None, params_desc_dict=None):
        self.params_desc_dict = {
            "get": {
                "page": "当前页码",
                "page_size": "每一页显示的行数. 默认传 10条"
            },
            "other": {

            }
        }

        if params_desc_dict:
            if 'get' in params_desc_dict:
                self.params_desc_dict['get'].update(params_desc_dict['get'])

            if 'other' in params_desc_dict:
                self.params_desc_dict['other'].update(params_desc_dict['other'])

        super(BaseSchema, self).__init__(manual_fields)

    def get_link(self, path, method, base_url):
        link = super(BaseSchema, self).get_link(path, method, base_url)

        fields = []

        params_method = 'get' if method.lower() == 'get' else 'other'

        for field in link.fields:
            if field.name in self.params_desc_dict[params_method].keys():
                field = field._replace(
                    schema=coreschema.String(description=self.params_desc_dict[params_method][field.name]))

            fields.append(field)

        return coreapi.Link(
            url=link.url,
            action=link.action,
            encoding=link.encoding,
            fields=fields,
            description=link.description
        )

periodictaskSchema = BaseSchema(params_desc_dict={
    'other': {
        "crontab": "定时crontab. json。 包含的字段有: minute, hour, day_of_week, day_of_month, month_of_year",
        "name": "该定时任务名称",
        "task": "模板任务名",
        "args": "传递给任务模板参数. 数组",
        "kwargs": "传递给任务模板参数. json字符串",
        "queue": "将任务放在哪个队列中.",
        "enabled": "是否开启该任务. True or False. 默认为True",
        "description": "定时任务说明"
    }
})

在view中绑定自定义的schema

class PeriodictasksViewSet(viewsets.ModelViewSet):
    queryset = PeriodicTask.objects.all()
    serializer_class = PeriodictaskSerializer
    schema = periodictaskSchema

方法二

如果只是普通的APIView的话,直接在AutoSchema中添加字段即可。

databaseInfoSchema = AutoSchema(manual_fields=[
    coreapi.Field(name="db", required=True, location="query",
                  schema=coreschema.String(description="数据库host, normal或者sub")),
    coreapi.Field(name="database", location="query", schema=coreschema.String(description="数据库")),
    coreapi.Field(name="table", required=True, location="query", schema=coreschema.String(description="数据库表"))
])

绑定自定义schema

class DataBaseInfo(APIView):
    schema = databaseInfoSchema

    def get(self, request):
        pass

location

location描述
query查询. list
form表单提交. post
path在url中的,/oozieJob/{id}/. read

欢迎关注,互相学习,共同进步~

我的个人博客

我的微信公众号:编程黑洞

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django REST framework是一个基于Django的强大Web API框架,可以帮助开发者快速构建RESTful API。下面是Django REST framework后端开发的文档。 ## 安装 可以通过pip安装Django REST framework: ``` pip install djangorestframework ``` ## 配置 1. 将`rest_framework`添加到`INSTALLED_APPS`中: ```python INSTALLED_APPS = [ ... 'rest_framework', ... ] ``` 2. 添加REST framework的默认设置到`settings.py`文件中: ```python REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.AllowAny', ], 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ], } ``` ## 序列化 Django REST framework的核心是序列化。它允许将复杂的Python数据结构转换为JSON、XML等格式。 ### 创建序列化器 1. 创建一个`serializers.py`文件,并导入`serializers`: ```python from rest_framework import serializers from .models import Book ``` 2. 创建一个`BookSerializer`类: ```python class BookSerializer(serializers.ModelSerializer): class Meta: model = Book fields = '__all__' ``` `fields`属性指定了需要序列化的模型字段。 ### 使用序列化器 在视图中使用序列化器,可以将模型转换为JSON格式的响应。 ```python from rest_framework import generics from .models import Book from .serializers import BookSerializer class BookList(generics.ListCreateAPIView): queryset = Book.objects.all() serializer_class = BookSerializer ``` ## 视图 Django REST framework提供了多种视图,包括基于函数的视图和基于类的视图。 ### 基于函数的视图 1. 创建一个`views.py`文件,并导入Django REST framework的视图: ```python from rest_framework.decorators import api_view from rest_framework.response import Response ``` 2. 创建一个`book_list`函数: ```python @api_view(['GET', 'POST']) def book_list(request): if request.method == 'GET': books = Book.objects.all() serializer = BookSerializer(books, many=True) return Response(serializer.data) elif request.method == 'POST': serializer = BookSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) return Response(serializer.errors, status=400) ``` `@api_view`装饰器表示该视图只接受`GET`和`POST`请求。`BookSerializer`用于将模型转换为JSON格式的响应。 ### 基于类的视图 1. 创建一个`views.py`文件,并导入Django REST framework的视图: ```python from rest_framework import generics ``` 2. 创建一个`BookList`类: ```python class BookList(generics.ListCreateAPIView): queryset = Book.objects.all() serializer_class = BookSerializer ``` `queryset`属性指定需要序列化的模型,`serializer_class`属性指定使用的序列化器。 ## 路由 Django REST framework的路由是基于Django的URLconf的。可以使用Django REST framework自带的`DefaultRouter`或者自定义路由。 ### 使用`DefaultRouter` 1. 创建一个`urls.py`文件,并导入`DefaultRouter`: ```python from rest_framework.routers import DefaultRouter ``` 2. 在`views.py`中导入视图,并创建一个`router`: ```python from .views import BookList router = DefaultRouter() router.register(r'books', BookList) ``` `r'books'`是路由名称,`BookList`是视图类。 3. 在`urls.py`中将路由添加到URLconf中: ```python from django.urls import path, include urlpatterns = [ path('', include(router.urls)), ] ``` ### 自定义路由 1. 创建一个`urls.py`文件,并导入视图: ```python from django.urls import path from .views import book_list ``` 2. 创建一个URLconf: ```python urlpatterns = [ path('books/', book_list, name='book-list'), ] ``` `book_list`是一个基于函数的视图。 3. 在主URLconf中包含自定义路由: ```python from django.urls import path, include urlpatterns = [ path('', include('myapp.urls')), ] ``` ## 认证和权限 Django REST framework提供了多种认证和权限选项,可以通过`settings.py`中的`DEFAULT_AUTHENTICATION_CLASSES`和`DEFAULT_PERMISSION_CLASSES`设置默认选项。 ### 认证 Django REST framework提供了多种认证选项,包括SessionAuthentication、BasicAuthentication和TokenAuthentication等。 ```python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.TokenAuthentication', ], } ``` ### 权限 Django REST framework提供了多种权限选项,包括AllowAny、IsAuthenticated和IsAdminUser等。 ```python REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.AllowAny', 'rest_framework.permissions.IsAuthenticated', 'rest_framework.permissions.IsAdminUser', ], } ``` ## 参考资料 - [Django REST framework官方文档](https://www.django-rest-framework.org/) - [Django REST framework教程](https://www.django-rest-framework.org/tutorial/1-serialization/)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值