使用 Django Rest Framework 向前端展示接口

一、前言

这里写图片描述
之前 Java 开发,基于前后端分离,使用 Swagger 向前端展示接口,前端则可以清晰地调用接口,进行页面渲染等操作。
参考文献:Django REST framework 官网

近来为了部署项目中用 Python 编写 AI 算法接口,为了无缝对接,使用了基于 Python 的 Django,为了展示接口等其他复杂操作,使用了基于 Django 的 Django Rest Framework

类似 Java 里边基于 Java 的 Spring,基于 Spring 的 SpringBoot

DRF 也可以使用 Swagger 进行前后端合作,也许是用了近半年的 Swagger,审美疲劳了,觉得与其作用相当的 DRF Docs 异常炫酷。

二、代码

代码放在 github 上,细节自行查阅:https://github.com/larger5/DRFDocs.git
这里写图片描述
这里主要列举 DRF 的 ViewSet+Router 自带配置 url、API文档 fiter 的代码
好比Java 的 SpringBoot 自带封装 bean 一样强大

1、Model

from django.db import models

# Create your models here.
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField()
    def __str__(self):
        return "%d" % self.pk

2、Serializer

from rest_framework import serializers
from booktest.models import BookInfo

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model= BookInfo
        # fields = ('btitle','bpub_date')
        fields = '__all__'  # 包含所有属性

3、filter

import django_filters
from django.db.models import Q
from .models import BookInfo

class BooksFilter(django_filters.rest_framework.FilterSet):

    # Django2.0 为 field_name 而不是 name
    btitle=django_filters.CharFilter(field_name='btitle',lookup_expr='icontains')   # contains 区分大小写

    class Meta:
        model = BookInfo
        fields = ['btitle', 'bpub_date']

4、view

from .models import BookInfo
from rest_framework import mixins
from .serializers import BookSerializer
from rest_framework import viewsets
from rest_framework.pagination import PageNumberPagination
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters
from .filters import BooksFilter
class GoodsPagination(PageNumberPagination):
    page_size_query_param = 'page_size'
    page_query_param = "page"
    # 默认值
    page_size = 2
    max_page_size = 100

class BooksListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):

    """
    接口说明
    """
    queryset = BookInfo.objects.all()
    serializer_class = BookSerializer
    pagination_class = GoodsPagination
    # 自定义过滤(没有下面会报错)
    filter_class = BooksFilter
    filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
    # 搜索
    search_fields = ('btitle')


5、Settings

这里要细心

INSTALLED_APPS = [
    ...
    'rest_framework',
    ...
]
ROOT_URLCONF = 'docs.urls'
REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}

6、url

from django.contrib import admin
from django.urls import path

from django.conf.urls import url, include
from booktest.views import BooksListViewSet
from rest_framework.routers import DefaultRouter
from rest_framework.documentation import include_docs_urls

# 配置 url
router = DefaultRouter()
router.register(r'books',BooksListViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^api/', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'docs/', include_docs_urls(title="后台接口")),
    url(r'^', include(router.urls)),
]

三、效果


这里写图片描述

这里写图片描述

四、参考文章

Django Rest Framework 3.8 自动生成 API 文档

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页