xadmin引入drf-yasg生成Swagger API文档

一、安装drf-yasg:

由于django-rest-swagger已经废弃了

所以引入了drf-yasg

pip install drf-yasg

安装install drf-yasg库

https://github.com/axnsan12/drf-yasg

Github主页

二、工程的目录结构:

demo/settings.py:

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# Quick-start development settings - unsuitable for production# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!SECRET_KEY = ‘[email protected]^k!pw$6kx*0$+9#%[email protected]*h^+xs%5&(+q*b181&o$)l‘

# SECURITY WARNING: don‘t run with debug turned on in production!DEBUG = True

ALLOWED_HOSTS = []

# Application definition

INSTALLED_APPS = [    ‘django.contrib.admin‘,    ‘django.contrib.auth‘,    ‘django.contrib.contenttypes‘,    ‘django.contrib.sessions‘,    ‘django.contrib.messages‘,    ‘django.contrib.staticfiles‘,    ‘product.apps.ProductConfig‘,

    ‘xadmin‘,    ‘crispy_forms‘,    ‘reversion‘,    # 添加django-xadmin

    ‘import_export‘,    # 导入导出

    ‘ckeditor‘,    ‘ckeditor_uploader‘,    # 富文本编辑器

    ‘rest_framework‘,    # django-rest-framework

    ‘drf_yasg‘,    # drf-yasg]

MIDDLEWARE = [    ‘django.middleware.security.SecurityMiddleware‘,    ‘django.contrib.sessions.middleware.SessionMiddleware‘,    ‘django.middleware.common.CommonMiddleware‘,    ‘django.middleware.csrf.CsrfViewMiddleware‘,    ‘django.contrib.auth.middleware.AuthenticationMiddleware‘,    ‘django.contrib.messages.middleware.MessageMiddleware‘,    ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,]

ROOT_URLCONF = ‘demo.urls‘

TEMPLATES = [    {        ‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘,        ‘DIRS‘: [os.path.join(BASE_DIR, ‘templates‘)]        ,        ‘APP_DIRS‘: True,        ‘OPTIONS‘: {            ‘context_processors‘: [                ‘django.template.context_processors.debug‘,                ‘django.template.context_processors.request‘,                ‘django.contrib.auth.context_processors.auth‘,                ‘django.contrib.messages.context_processors.messages‘,            ],        },    },]

WSGI_APPLICATION = ‘demo.wsgi.application‘

# Database# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

DATABASES = {    ‘default‘: {        ‘ENGINE‘: ‘django.db.backends.mysql‘,        ‘NAME‘: ‘demo‘,        ‘HOST‘: ‘192.168.1.106‘,        ‘PORT‘: ‘3306‘,        ‘USER‘: ‘root‘,        ‘PASSWORD‘: ‘[email protected]‘,    }}# MySQL数据库配置

# Password validation# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [    {        ‘NAME‘: ‘django.contrib.auth.password_validation.UserAttributeSimilarityValidator‘,    },    {        ‘NAME‘: ‘django.contrib.auth.password_validation.MinimumLengthValidator‘,    },    {        ‘NAME‘: ‘django.contrib.auth.password_validation.CommonPasswordValidator‘,    },    {        ‘NAME‘: ‘django.contrib.auth.password_validation.NumericPasswordValidator‘,    },]

# Internationalization# https://docs.djangoproject.com/en/2.2/topics/i18n/

LANGUAGE_CODE = ‘zh-hans‘# 简体中文界面

TIME_ZONE = ‘Asia/Shanghai‘# 亚洲/上海时区

USE_I18N = True

USE_L10N = True

USE_TZ = False# 不使用国际标准时间

# Static files (CSS, JavaScript, Images)# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = ‘/static/‘STATIC_ROOT = os.path.join(BASE_DIR, ‘static‘)# 定义静态文件的目录

MEDIA_URL = ‘/media/‘MEDIA_ROOT = os.path.join(BASE_DIR, ‘media‘)# 定义图片存放的目录

IMPORT_EXPORT_USE_TRANSACTIONS = True# 在导入数据时使用数据库事务,默认False

CKEDITOR_BASEPATH = os.path.join(BASE_DIR, "/static/ckeditor/ckeditor/")# 配置CKEditor的模板路径CKEDITOR_CONFIGS = {    ‘default‘: {        ‘toolbar‘: ‘full‘,        ‘height‘: 300,        ‘width‘: 900,    },}# 使用默认的主题名称CKEDITOR_UPLOAD_PATH = "uploads/"# 配置图片存储的目录,不用创建# 默认使用MEDIA_ROOT,所以路径是media/uploadsCKEDITOR_RESTRICT_BY_DATE = True# 按年/月/日的目录存储图片CKEDITOR_BROWSE_SHOW_DIRS = True# 按存储在其中的目录对图像进行分组,并按日期排序CKEDITOR_IMAGE_BACKEND = "pillow"# 启用缩略图

REST_FRAMEWORK = {    ‘DEFAULT_PAGINATION_CLASS‘: ‘rest_framework.pagination.PageNumberPagination‘,    ‘PAGE_SIZE‘: 5    # 分页}

demo/urls.py:

import xadmin

from django.conf import settingsfrom django.conf.urls import urlfrom django.conf.urls.static import staticfrom django.urls import path, includefrom rest_framework import routers, permissionsfrom drf_yasg.views import get_schema_viewfrom drf_yasg import openapi

from product import views

router = routers.DefaultRouter()router.register(‘product_info‘, views.ProductInfoViewSet)

schema_view = get_schema_view(   openapi.Info(      title="测试工程API",      default_version=‘v1.0‘,      description="测试工程接口文档",      terms_of_service="https://www.google.com/policies/terms/",      contact=openapi.Contact(email="[email protected]"),      license=openapi.License(name="BSD License"),   ),   public=True,   permission_classes=(permissions.AllowAny,),)

urlpatterns = [    path(‘admin/‘, xadmin.site.urls),

    path(‘ckeditor/‘, include(‘ckeditor_uploader.urls‘)),    # 添加CKEditor的URL映射

    path(‘api/‘, include(router.urls)),    path(‘api-auth/‘, include(‘rest_framework.urls‘, namespace=‘rest_framework‘)),    # 配置django-rest-framwork API路由

    url(r‘^swagger(?P<format>\.json|\.yaml)$‘, schema_view.without_ui(cache_timeout=0), name=‘schema-json‘),    path(‘swagger‘, schema_view.with_ui(‘swagger‘, cache_timeout=0), name=‘schema-swagger-ui‘),    path(‘redoc/‘, schema_view.with_ui(‘redoc‘, cache_timeout=0), name=‘schema-redoc‘),    # 配置drf-yasg路由]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)# 配置图片文件url转发

product/admin.py:

import xadmin

# Register your models here.from import_export import resourcesfrom xadmin import views

from product.models import ProductInfo

class ProductInfoResource(resources.ModelResource):

    class Meta:        model = ProductInfo

        skip_unchanged = True        # 导入数据时,如果该条数据未修改过,则会忽略        report_skipped = True        # 在导入预览页面中显示跳过的记录

        import_id_fields = (‘id‘,)        # 对象标识的默认字段是id,您可以选择在导入时设置哪些字段用作id

        fields = (            ‘id‘,            ‘product_name‘,            ‘product_picture‘,            ‘product_describe‘,            ‘product_manager‘,        )        # 白名单

        exclude = (            ‘product_detail‘,            ‘create_time‘,            ‘update_time‘,        )        # 黑名单

class ProductInfoAdmin(object):    list_display = [        ‘id‘,        ‘product_name‘,        ‘product_picture‘,        ‘product_describe‘,        ‘product_manager‘,        ‘product_detail‘,        ‘create_time‘,        ‘update_time‘,    ]    # 要显示的字段列表

    ordering = [‘id‘]    # 按照id顺序排列,如果是倒序-id

    search_fields = [‘product_name‘, ‘product_manager‘]    # 要搜索的字段

    list_filter = [‘product_name‘, ‘create_time‘, ‘update_time‘]    # 要筛选的字段

    show_detail_fields = [‘product_name‘, ‘product_detail‘]    # 要展示详情的字段

    list_editable = [‘product_name‘, ‘product_describe‘, ‘product_manager‘]    # 列表可直接修改的字段

    list_per_page = 10    # 分页

    # model_icon = ‘fa fa-laptop‘    # 配置模型图标,也可以在GlobalSetting里面配置

    import_export_args = {        ‘import_resource_class‘: ProductInfoResource,        # ‘export_resource_class‘: ProductInfoResource,    }    # 配置导入按钮

class BaseSetting(object):    enable_themes = True    use_bootswatch = True    # 开启主题自由切换

class GlobalSetting(object):    global_search_models = [ProductInfo]    # 配置全局搜索选项,默认搜索组、用户、日志记录    site_title = "测试平台"    # 标题    site_footer = "测试部"    # 页脚

    menu_style = "accordion"    # 左侧菜单收缩功能    apps_icons = {        "product": "fa fa-music",    }    # 配置应用图标,即一级菜单图标    global_models_icon = {        ProductInfo: "fa fa-film",    }    # 配置模型图标,即二级菜单图标

xadmin.site.register(ProductInfo, ProductInfoAdmin)# 注册模型

xadmin.site.register(views.BaseAdminView, BaseSetting)xadmin.site.register(views.CommAdminView, GlobalSetting)

product/apps.py:

from django.apps import AppConfig

class ProductConfig(AppConfig):    name = ‘product‘    verbose_name = ‘产品管理‘

product/models.py:

from ckeditor_uploader.fields import RichTextUploadingFieldfrom django.db import models

# Create your models here.

class ProductInfo(models.Model):    # 产品表

    product_name = models.CharField(max_length=32, verbose_name="产品名称", default="请输入产品名称")    # 产品名称    product_picture = models.ImageField(blank=True,                                        null=True,                                        upload_to="pictures/%Y%m%d",                                        max_length=255,                                        verbose_name="产品图片")    # 产品图片,数据库里面存储的是图片的相对路径    product_describe = models.TextField(max_length=255, verbose_name="产品描述", default="请输入产品描述")    # 产品描述    product_manager = models.CharField(max_length=11, verbose_name="产品经理", default="请输入产品经理名字")    # 产品经理    product_detail = RichTextUploadingField(verbose_name="产品详情", default="", blank=True, null=True)    # 产品详情,带有上传图片功能的富文本编辑器    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")    # 创建时间    update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="修改时间")    # 修改时间

    class Meta:        db_table = ‘product_info‘        # 设置表名,默认表名是:应用名称_模型类名        # 带有应用名的表名太长了

        verbose_name = ‘产品列表‘        verbose_name_plural = "产品列表"

    def __str__(self):        return self.product_name

product/serializers.py:

from rest_framework import serializers

from product.models import ProductInfo

class ProductInfoSerializer(serializers.HyperlinkedModelSerializer):    # 序列化

    class Meta:        model = ProductInfo        fields = "__all__"

product/views.py:

# Create your views here.from rest_framework import viewsets

from product.models import ProductInfofrom product.serializers import ProductInfoSerializer

class ProductInfoViewSet(viewsets.ModelViewSet):    """        retrieve:            返回一组(查)

        list:            返回所有组(查)

        create:            创建新组(增)

        delete:            删除现有的一组(删)

        partial_update:            更新现有组中的一个或多个字段(改:部分更改)

        update:            更新一组(改:全部更改)    """

    queryset = ProductInfo.objects.all()    serializer_class = ProductInfoSerializer

三、启动服务:

python manage.py collectstatic

复制静态资源文件

python manage.py makemigrations

激活模型

python manage.py migrate

迁移

python manage.py createsuperuser

创建超级管理员

python manage.py runserver

启动服务

四、Swagger API文档:

http://127.0.0.1:8000/redoc/

http://127.0.0.1:8000/swagger

原文地址:https://www.cnblogs.com/yjlch1016/p/11399946.html

时间: 2024-10-04 23:50:59

xadmin引入drf-yasg生成Swagger API文档的相关文章

利用Swagger Maven Plugin生成Rest API文档

利用Swagger Maven Plugin生成Rest API文档 Swagger Maven Plugin This plugin enables your Swagger-annotated project to generate Swagger specs and customizable, templated static documents during the maven build phase. Unlike swagger-core, swagger-maven-plugin

MyEclipse生成java API文档

API文档是提供接口是必须的,如果用word文档,不仅书写起来很麻烦,而且对于使用者来说很不方便.可以使用myEclipse来生成API文档,与java提供的官方API文档一样.一下是详细步骤. /**  * 数据库操作通用程序包  */ package xju.dbhelper; import java.sql.*; /**  * 数据库操作通用接口  * @author xju  * @version 1.0  */ public abstract interface DBHelper {

javadoc 工具生成开发API文档

=====================先来一点成就感===================== 1 package com.springMybatis.dao; 2 3 import com.springMybatis.model.*; 4 5 6 /** 7 * AuthorizationDao 定义Authorization接口 8 * @author g.qu 9 * @see java.lang 10 */ 11 public interface AuthorizationDao{

ns3使用doxygen生成离线api文档

doxygen的维基介绍: Doxygen是一个编写软件参考文檔的工具.该文檔是直接写在源代码中,因此比较容易保持更新.Doxygen可以交叉引用文檔和源代码,使文件的读者可以很容易地引用实际的源代码. ns3的官方也有doxygen生成的文档,参见:ns3官方doxygen 但是由于网络或者其它原因,我们有本地离线访问的需求,于是doxygen就派上用场了.下面来看看怎么使用doxygen: 1. 官方的方法如下: ns-3 requires Doxygen version 1.5.4 or

Swagger API文档

接口文档是前后端开发对接时很重要的一个组件.手动编写接口文档既费时,又存在文档不能随代码及时更新的问题,因此产生了像swagger这样的自动生成接口文档的框架.swagger文档一般是随项目代码生成与更新,访问地址也是基于项目地址,因此对项目数不多的团队还好.如果团队的项目很多,比如采用微服务架构的团队,动则几十甚至上百个服务项目,那就意味着前端开发人员需要记住几十甚至上百个swagger文档地址,那就很不友好了.目前貌似还没有较流行的API文档集中化管理项目(也或者是我没找到),因此花了点时间

Spring Boot中使用Swagger2生成RESTful API文档(转)

效果如下图所示: 添加Swagger2依赖 在pom.xml中加入Swagger2的依赖 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <versi

Grunt-jsdoc生成JS API文档

具体的请看官网 https://github.com/krampstudio/grunt-jsdoc 一:首先确保本机电脑上是否已经安装了nodejs和npm.具体安装过程可以看如下: http://www.cnblogs.com/tugenhua0707/p/3497488.html 二: 在安装grunt-jsodc之前,我们先要安装grunt,因此我在F盘下 新建文件夹gruntJSDoc 其中根目录里面新建一个package.json文件,内容如下: { "name": &qu

使用sphinx快速生成Python API 文档

一  简单介绍 不管是开源还是闭源,文档都是很重要的.当然理论上说,最好的文档就是代码本身,但是要让所有人都能读懂你的代码这太难了.所以我们要写文档.大部分情况,我们不希望维护一份代码再加上一份文档,这样做很容易造成文档和代码的不一致,程序员最讨厌更新文档了.所以最佳实践就是在程序员代码中加注释,然后通过构建脚本自通生成文档,包括html,latex,pdf等. 对应于Pyhon,有很多可供选择的工具: sphinx中文版介绍 Sphinx使用 reStructuredText作为标记语言(类似

Spring Boot 整合 swagger2 自动生成 RESTFul API 文档

1)首先编辑pom.xml添加依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId>