django-rest-swagger的优化使用方法

yizhihongxing

下面我将为您详细讲解“django-rest-swagger的优化使用方法”的完整攻略:

1. 什么是django-rest-swagger?

django-rest-swaggerrest_framework 的一个扩展,它可以自动生成 API 的文档页面,让前端和其他开发者更方便的查看和测试 API 接口。

2. 使用django-rest-swagger前的准备工作

安装 django-rest-swagger

pip install django-rest-swagger

settings.py 配置 REST_FRAMEWORK 和 SWAGGER_SETTINGS

INSTALLED_APPS += [
    'rest_framework_swagger',
]

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

SWAGGER_SETTINGS = {
    'USE_SESSION_AUTH': False, # 不使用session验证
    'SECURITY_DEFINITIONS': {
        'Api Token': {
           'type': 'apiKey',
           'name': 'Authorization',
           'in': 'header'
        }
    }
}

3. 使用django-rest-swagger优化API的详细步骤

3.1 使用schema生成文档

views.py 中指定 schema 属性为 SwaggerAutoSchema 的实例,这样能使文档更清晰,并生成文档的一些其他特性,例如分组、描述等

示例代码:

from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
from rest_framework.schemas import ManualSchema
from rest_framework_swagger import renderers
from rest_framework_swagger import serializers
from rest_framework_swagger import viewsets as vs
from rest_framework_swagger import renderers


class BooksViewSet(viewsets.ModelViewSet):
    queryset = Books.objects.all()
    serializer_class = BooksSerializer
    schema = vs.SwaggerAutoSchema(

        operation_id_base='book-demo',
        manual_fields=[
            coreapi.Field('category', required=True, location='query', description='类型')
        ],
        responses={
            '400': "参数错误",
            '401': "没有访问权限,或者AccessToken过期",
            '404': "资源不存在",
            '405': "请求方法错误",
            '500': "服务器错误"
        },

    )

    @action(
        detail=False,
        methods=['get'],
        permission_classes=[AllowAny],
        serializer_class=ser.BookListSerializer,
        renderer_classes=[renderers.JSONRenderer],
   )
    def get_books_from_category(self, request):
        category_name = request.query_params.get("category", "")
        category = Category.objects.get(name=category_name)

        books = Books.objects.filter(category=category)
        serializer = BookListSerializer(books, many=True, context={'request': request})
        return JsonResponse(serializer.data, safe=False)

3.2 使用markdown语法描述API

在API的 docstring 里面(即 views.py 文件里面各个方法的参数说明文字),编写Markdown格式的文档,可以更好的让其他开发者了解API的使用方法和参数信息。

示例代码:

class BooksViewSet(viewsets.ModelViewSet):
    queryset = Books.objects.all()
    serializer_class = BooksSerializer

    def list(self, request):
        """
        获取所有书籍
        ---
        parameters:
            - name: format
              description: 输出格式
              required: false
              type: string
              choices: ['json', 'xml']
              default: json
              location: query

        """
        books = self.get_queryset()
        serializer = self.get_serializer(books, many=True)
        return Response(serializer.data)

4. 示例代码

在此提供一个能够让前端开发者通过API文档请求WebSocket 实时推送服务的示例代码。

import logging
import json
from channels import Group
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_framework_swagger import viewsets as vs

logging.basicConfig()

class NotificationViewSet(viewsets.ViewSet):
    @action(detail=False, methods=['post'], permission_classes=[AllowAny])
    def send_message(self, request):
        """
        发送通知
        ---
        parameters:
            - name: msg
              description: 通知内容
              type: string
              required: true
            - name: uuid
              description: 用户id
              type: string
              required: true

        """
        data = request.data
        group_name = f"notification-{data['uuid']}"
        Group(group_name).send({'text': json.dumps(data)})
        return Response({'code': 200, "msg": "ok"})

这段代码中,我们通过 Channel 包创建了一个 WebSocket 的分组(Group),然后在 Django 中,通过请求 API 的方式向这个 Group 中发送了一条消息,消息的内容是 request.data 中的 msg,接收到该WebSocket消息的客户端便可获取该实时消息。

5. 总结

以上就是django-rest-swagger优化API的方法和示例代码,除了可以对API接口进行清晰的文档描述外,还能通过某些特性(例如分组、描述等)组织文档,使文档更清晰直观。同时, 我们还给出了一个示例代码,用以展示如何配合使用 websocket 实现消息的实时推送功能,希望对您有帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django-rest-swagger的优化使用方法 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python 制作自动化翻译工具

    Python 制作自动化翻译工具攻略 介绍 自动化翻译工具是一种可以将一种语言的文字自动转化为另一种语言的文字的应用程序。在这个攻略中,我们将会使用Python语言,通过调用谷歌翻译API,创建一个简单的自动化翻译工具,它可以将一些简单的英文文字翻译成其他语言。 前置条件 在开始之前,我们需要准备以下工具和环境: Python 3 Anaconda 谷歌翻译…

    python 2023年5月19日
    00
  • Python计时相关操作详解【time,datetime】

    Python计时相关操作详解【time,datetime】 在Python中涉及到计时的操作很多,比如计算程序运行时间、获取当前日期和时间等,主要用到了两个模块:time和datetime。在本文中,我们会详细讲解这两个模块的常用方法,并给出相应的代码示例。 time模块 time.time() time.time()函数用于获取当前时间的时间戳,返回值为浮…

    python 2023年6月2日
    00
  • 对Python多线程读写文件加锁的实例详解

    我们来详细讲解“对Python多线程读写文件加锁的实例详解”的完整攻略。 本文主要是介绍如何使用Python多线程读写文件,并在多线程并发操作时加锁,以保证文件的数据写入不会出问题。常见的场景是,在数据量大的情况下,使用多线程加快数据的插入和查询速度,而在文件读写时,我们需要考虑到多个线程操作同一个文件时,可能会因为竞争出现数据不一致的问题。 下面我们就来看…

    python 2023年5月18日
    00
  • Python通过内置函数和自写算法DFS实现排列组合

    针对您提到的主题,我会给出详细的解释和两个示例。 什么是排列组合? 排列组合是数学中的一个分支,用于计算不同元素之间的排列方式和组合方式。在计算机中,排列组合有着广泛的应用,例如搜索引擎中的搜索结果排列、网络爬虫中的爬取页面顺序等方面。 在 Python 中,可以通过内置函数和自写算法 DFS 来实现排列组合的计算。 Python中的内置函数实现排列组合 P…

    python 2023年5月14日
    00
  • Python实现石头剪刀布游戏

    下面是“Python实现石头剪刀布游戏”的完整攻略。 确定游戏规则 石头剪刀布是一种猜拳游戏,游戏规则如下: 石头战胜剪刀(石头打剪刀) 剪刀战胜布(剪刀剪布) 布战胜石头(布包住石头) 如果出的手势一样,则为平局 编写程序代码 以下是一个可以实现石头剪刀布游戏的Python程序代码: import random # 定义游戏规则 rules = { ‘ro…

    python 2023年5月19日
    00
  • Python进阶之自定义对象实现切片功能

    我会详细讲解“Python进阶之自定义对象实现切片功能”的完整攻略。在Python中,我们可以通过对象的切片操作来获取一个特定范围的对象切片。如果要自定义对象的切片操作,可以通过重载对象的__getitem__方法来实现。 步骤如下: 1.确定切片参数首先,我们需要确定切片参数——切片范围和步长。切片范围可以用start,stop和step三个参数来表示。其…

    python 2023年6月5日
    00
  • python爬取一组小姐姐图片实例

    Python爬取一组小姐姐图片实例 在本攻略中,我们将介绍如何使用Python爬取一组小姐姐图片。我们将提供两个示例,演示如何使用requests库和BeautifulSoup库、如何使用Scrapy框架爬取图片。 步骤1:分析目标网站 在开始之前,我们需要分析目标网站的结构和数据。我们可以使用浏览器的开发者工具来分析目标网站。在本攻略中,我们将使用http…

    python 2023年5月15日
    00
  • Python 判断时间是否在时间区间内的实例

    下面是“Python 判断时间是否在时间区间内的实例”的完整攻略。 思路分析 判断一个时间点是否在时间区间内,需要用到 Python 的 datetime 模块。具体的思路是,将时间区间拆分成起始时间和截止时间,并将要判断的时间点转化为 datetime 对象,然后比较两个对象之间的大小关系即可。 代码实现 首先,我们需要引入 datetime 模块。 fr…

    python 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部