一、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]