写在前面
在之前的文章中谈到 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 样式,并提供命令行工具去测试我们的接口。总的来说自带的界面用于接口的调试已经够用,而且整个样式比较简单美观。
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'),
...
]
- 打开浏览器访问 http://127.0.0.1:8000/swagger/
- 打开浏览器访问 http://127.0.0.1:8000/redoc/
共支持四种样式的 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 。所以面对这些工具,老一辈的开发人员早已为你构筑起坚实的地基,你需要做的是了解它并使用它。