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

下面我将为您详细讲解“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日

相关文章

  • SQLAlchemy – Python 编程错误’转换小数会丢失精度’,’HY000′

    【问题标题】:SQLAlchemy – Python Programming Error ‘Converting decimal loses precision’, ‘HY000’SQLAlchemy – Python 编程错误’转换小数会丢失精度’,’HY000’ 【发布时间】:2023-04-06 13:59:01 【问题描述】: 我正在使用 SQL A…

    Python开发 2023年4月7日
    00
  • python利用xpath爬取网上数据并存储到django模型中

    Python利用XPath爬取网上数据并存储到Django模型中 本攻略将介绍如何使用Python利用XPath爬取网上数据,并将数据存储到Django模型中。我们将使用Python的requests、lxml和Django模块,以及XPath语法来实现这个过程。本攻略将分为以下几个步骤: 安装必要的Python模块 确定要爬取的网站和数据 使用XPath解…

    python 2023年5月15日
    00
  • python爬虫分布式获取数据的实例方法

    我来为您详细讲解 “Python爬虫分布式获取数据的实例方法” 的完整攻略。 什么是Python爬虫分布式? Python爬虫分布式是指将一个爬虫程序在多台计算机上执行,可以大大提高爬虫的性能和效率。通常情况下,Python爬虫分布式使用的工具是Scrapy-Redis,它是Scrapy和Redis结合使用的分布式爬虫框架。 Python爬虫分布式获取数据的…

    python 2023年5月14日
    00
  • Python爬虫实现HTTP网络请求多种实现方式

    Python爬虫实现HTTP网络请求多种实现方式 在Python爬虫中,对HTTP网络请求的处理非常重要,实现了HTTP网络请求后可以从互联网上抓取所需的数据。在Python中,我们可以使用多种方式实现HTTP网络请求,这里为大家介绍一些常见的方式。 使用urllib库 urllib是Python标准库中一个HTTP请求处理库,可以轻松地通过urllib库实…

    python 2023年5月14日
    00
  • 重构Python代码的六个实例

    当然,我很乐意为您提供“重构Python代码的六个实例”的完整攻略。以下是详细的步骤和示例: 什么是重构? 重构是指在不改变代码外部行为的情况下,对代码内部结构进行修改,以提高代码的可读性、可维护性和可扩展性。重构可以使代码更加简洁、清晰、易于理解和修改,从而提高代码的质量和效率。 重构的六个实例 实例1:使用列表推导式代替for循环 以下是一个使用for循…

    python 2023年5月13日
    00
  • Python 中获取数组的子数组示例详解

    Python 中获取数组的子数组示例详解 在 Python 中,我们可以通过一些简单的方式来获取数组的子数组。在这篇文章中,我们将介绍两种获取数组子数组的方法以及相应的代码示例。 方法一:切片法 切片法是 Python 中非常常用的一种遍历数组的方法,我们可以通过它快速获取一个数组的子数组。 例如,如果我们有如下的一个数组 arr: arr = [0, 1,…

    python 2023年6月5日
    00
  • python使用PyQt5的简单方法

    Python使用PyQt5的简单方法 PyQt5是Python中的一个GUI库,用于创建桌面应用程序的图形界面。PyQt5是Qt5的Python绑定,Qt5是C++中的GUI框架。通过PyQt5的使用,你可以在Python中使用Qt5创建具有现代设计的美观应用程序。 下面是使用PyQt5的简单方法: 安装PyQt5 首先确保你的Python版本为Python…

    python 2023年6月3日
    00
  • Python实现的拉格朗日插值法示例

    下面是详细讲解“Python实现的拉格朗日插值法示例”的完整攻略。 1. 什么是拉格朗日插值法 拉格朗日插值法是一种通过已知数据点来估计未知数据点的方法。它基于拉格朗日多项式,通过构造一个多项式函数来逼近原始数据,从而实现插值。 2. 拉格朗日插值法原理 假设有n数据点$(x_1,y_1),(x_2,y_2),…,(x_n,y_n)$,其中$x_i$互不…

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