一、API接口文档平台
使用API接口文档不经可以很好的的维护接口数据,还给测试人员的接口测试工作带来了便利;
我们可以在全局配置文件中添加路由路径生成接口文档
1、使用docs接口文档维护接口
1.1在全局配置文件里指定用于支持coreapi的Schema
# 指定用于支持coreapi的Schema
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
1.2在全局路由表中添加路径
from rest_framework.documentation import include_docs_urls
urlpatterns = [
path('docs/', include_docs_urls(title='接口文档', description='非常友好的接口文档')),
]
页面效果:
2、使用swaager接口文档维护接口
2.1 一定要先在配置表中注册drf_yasg,不然页面会报错
INSTALLED_APPS = [
'drf_yasg',
]
2.2 在全局路由表中添加路径
from rest_framework.documentation import include_docs_urls
schema_view = get_schema_view(
openapi.Info(
title="超人 API接口文档平台", # 必传
default_version='v1', # 必传
description="这是一个美轮美奂的接口文档",
terms_of_service="http://api.keyou.site",
contact=openapi.Contact(email="superman@qq.com"),
license=openapi.License(name="BSD License"),
),
public=True,
# permission_classes=(permissions.AllowAny,), # 权限类
)
urlpatterns = [
path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
]
页面效果:
2.3 我们还可以使用swaager文档转化为json或者yaml格式
from rest_framework.documentation import include_docs_urls
schema_view = get_schema_view(
openapi.Info(
title="超人 API接口文档平台", # 必传
default_version='v1', # 必传
description="这是一个美轮美奂的接口文档",
terms_of_service="http://api.keyou.site",
contact=openapi.Contact(email="superman@qq.com"),
license=openapi.License(name="BSD License"),
),
public=True,
# permission_classes=(permissions.AllowAny,), # 权限类
)
urlpatterns = [
re_path(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
]
页面效果:
3、使用redoc接口文档维护接口
3.1 一定要先在配置表中注册drf_yasg,不然页面会报错
INSTALLED_APPS = [
'drf_yasg',
]
3.2 在全局路由表中添加路径
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
schema_view = get_schema_view(
openapi.Info(
title="超哥 API接口文档平台", # 必传
default_version='v1', # 必传
description="这是一个美轮美奂的接口文档",
terms_of_service="http://api.keyou.site",
contact=openapi.Contact(email="gaochao100@qq.com"),
license=openapi.License(name="BSD License"),
),
public=True,
# permission_classes=(permissions.AllowAny,), # 权限类
)
urlpatterns = [
path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
]
页面效果:
二、日志器
在全局配置表中添加日志器
# LOGGING指定日志器的相关配置
LOGGING = {
# 指定日志版本
'version': 1,
# 指定是否禁用其他已存在的日志器
'disable_existing_loggers': False,
# 指定日志的输出格式
'formatters': {
# 指定普通的日志输出格式
'simple': {
'format': '%(asctime)s - [%(levelname)s] - [msg]%(message)s'
},
# 指定更详细的日志输出格式
'verbose': {
'format': '%(asctime)s - [%(levelname)s] - %(name)s - [msg]%(message)s - [%(filename)s:%(lineno)d ]'
},
},
# 指定日志的过滤器
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
# 定义日志的输出渠道
'handlers': {
# 指定控制台日志输出渠道
'console': {
'level': 'DEBUG',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
# 指定日志输出的日志配置
'file': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_DIR, "logs/mytest.log"), # 日志文件的位置
# 每一个日志文件的最大字节数
'maxBytes': 100 * 1024 * 1024,
# 指定日志文件总数
'backupCount': 10,
'formatter': 'verbose'
},
},
# 指定日志器
'loggers': {
'mytest': { # 定义了一个名为mytest的日志器
'handlers': ['console', 'file'],
'propagate': True,
'level': 'DEBUG', # 日志器接收的最低日志级别
},
}
}
使用日志器
# 导入logging模块
import logging
# 制定日志器对象,getLogger需要传递在settings-->LOGGING中,设置的日志器名称,必须要一致
my_logging=logging.getLogger('mytest')
my_logging.info('prijects的视图集类')
保存的日志文件信息为:
三、认证
全局认证类
drf的settings中有全局认证类
如果不指定授权类,则请求接口不受影响,仍然可以正常访问接口获取到返回数据;
如果指定授权类,则未登录时去请求接口,会返回未认证信息:
我们来创建一个用户
python manage.py createsuperuser
设置用户名、邮箱、密码
在database中的auth_user表里可以看到创建用户信息
当调用接口需要认证才能获取权限,但是用户没有认证时,需要我们进行登录
登录成功之后,就会进入之前访问的页面
局部认证类
有些接口并不是需要登录后才可以访问的,比如登录注册接口是需要一直暴露给用户使用的,这时候就需要给需要认证类的接口视图类定义局部认证类
优先级:局部认证类>全局认证类
from rest_framework.authentication import SessionAuthentication,BasicAuthentication
# 定义局部认证类
authentication_classes = [SessionAuthentication,BasicAuthentication]
四、授权
全局授权类
drf的settings中指定全局授权类
指定权限类(认证通过之后,会授予的权限)
默认的权限类为AllowAny,允许所有用户访问接口
指定只有登录之后,才具有访问接口的权限
'DEFAULT_PERMISSION_CLASSES': [
# 默认的权限类为AllowAny,允许所有用户返回接口
# 'rest_framework.permissions.AllowAny',
# 指定只有登录之后,才具有访问接口的权限
'rest_framework.permissions.IsAuthenticated',
],
局部授权类
有些接口并不是需要登录后才可以访问的,比如登录注册接口是需要一直暴露给用户使用的,这时候就需要给需要授权类的接口视图类定义局部授权类(需要登录认证后才授权)
优先级:局部授权类>全局授权类
from rest_framework.permissions import IsAuthenticated
# 定义局部授权类
permission_classes = [IsAuthenticated]