Django REST framework 文档、日志

2,869 阅读3分钟

写在前面

在之前的文章中谈到 Django REST framework 的一系列操作后,今天突然想到有个小功能虽然看是不重要但是却异常有用,所以特意写一篇文章分享一下关于 Django REST framework 的 API 文档与日志,同样具体的代码依旧是沿用之前的框架。

正文开始

1. Core API

Core API是用于描述API的文档规范。它用于提供可用路径的内部表示形式和API公开的可能的交互。它可以用于服务器端或客户端。

当使用服务器端时,coreAPI允许API支持呈现范围广泛的概要或超媒体格式。

# 环境准备
pipenv install coreapi
pip install coreapi-cli

# core api 基本使用
# 添加认证
$ coreapi credentials add 127.0.0.1 admin:admin --auth basic
Added credentials
127.0.0.1 "Basic YWRtaW46YWRtaW4="

# 基本使用
$ coreapi get http://127.0.0.1:8000/api/article/1
{
    "id": 1,
    "creator": "admin",
    "tag": "现代诗",
    "title": "如果",
    "content": "今生今世 永不再将你想起\n除了\n除了在有些个\n因落泪而湿润的夜里 如果\n如果你愿意"
}

coreAPI 主要是配合 DRF 自带 admin 样式,并提供命令行工具去测试我们的接口。总的来说自带的界面用于接口的调试已经够用,而且整个样式比较简单美观。

image.png

2. Swagger

由于公司内部 Java 项目居多,Spring项目基本都是集成 Swagger工具作为接口文档。当然 DRF 也是有对应的插件支持 drf-yasg ,下面就演示一下对应的使用。

1. 环境准备
pipenv install drf-yasg

2. 项目配置

# settings.py

INSTALLED_APPS = [
   ...
   'django.contrib.staticfiles',  # required for serving swagger ui's css/js files
   'drf_yasg',
   ...
]

# urls.py

...
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi

...

schema_view = get_schema_view(

    openapi.Info(
        title="Demo API",
        default_version='v1',
        description="Demo description",
        terms_of_service="",
        contact=openapi.Contact(email="admin@admin.com"),
        license=openapi.License(name="BSD License"),
    ),
    public=True,
    permission_classes=(permissions.AllowAny, ),
)

urlpatterns = [
   url(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
   url(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
   url(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
   ...
]

image.png

image.png

共支持四种样式的 API 样式的显示。不得不说真的是开发利器,下次再有前端同学找你要接口文档,你只需要甩给他四个链接,让他挨个点总能找到他喜欢且实用的接口文档。

3. 日志文件

  • 配置日志格式以及日志文件
# setting.py 添加日志配置

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': '{asctime} {filename}[line:{lineno}] {levelname} {message} {thread}-{process}',
            'datefmt': "%a, %d %b %Y %H:%M:%S",
            'style': '{',
        },
        'simple': {
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
    },
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            # 实际开发建议使用WARNING
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            # 实际开发建议使用WARNING
            'level': 'WARNING',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "demo.log"),
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'standard',
            # 文件内容编码
            'encoding': 'utf-8'
        },
    },
    # 日志对象
    'loggers': {
        'demo': {
            'handlers': ['console', 'file'],
            'propagate': True,  # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}

# 创建文件夹 
mkdir logs
  • 使用日志功能
# 使用日志

import logging
logger = logging.getLogger('demo')
logger.error("Hello world")

总结

对于开发人员来说日志功能、文档功能服务的对象应该是开发人员;文档功能更有利于开发人员调试自己的开发任务,日志更有利于记录问题重新 BUG 。所以面对这些工具,老一辈的开发人员早已为你构筑起坚实的地基,你需要做的是了解它并使用它。

参考资料