主流认证方式

主流认证方式:

  • Session

  • Token

  • JWT

主流认证方式:Session认证

主流认证方式:Token认证

主流认证方式:JWT认证

DRF认证

DRF认证与权限

目前DRF可任意访问,没有任何限制,是不符合生产环境标准的,因此接下来学习认证实现访问控制。

DRF支持四种认证方式:

  • BasicAuthentication:基于用户名和密码的认证,适用于测试

  • SessionAuthentication:基于Session的认证

  • TokenAuthentication:基于Token的认证

  • RemoteUserAuthentication:基于远程用户的认证

DRF支持权限:

  • IsAuthenticated:只有登录用户才能访问所有API

  • AllowAny:允许所有用户

  • IsAdminUser:仅管理员用户

  • IsAuthenticatedOrReadOnly:登录的用户可以读写API,未登录用户只读

DRF认证:Session认证

DRF认证:Token认证

默认的obtain_auth_token视图返回的数据是比较简单的,只有token一项,如果想返回更多的信息, 例如用户名,可以重写ObtainAuthToken类的方法实现:

限流

可以对接口访问的频率进行限制,以减轻服务器压力。

应用场景:投票、购买数量等

过滤

对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持。

文档:https ://www.django-rest-framework.org/api-guide/filtering/

安装:

pip install django-filter

添加APP:

INSTALLED_APPS = [
...
'django_filters'
]

添加DRF配置:

REST_FRAMEWORK = {
# 过滤
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

在视图中指定过滤的字段:

测试:http://127.0.0.1:8001/myapp_api/api/user?name=阿哲

搜索和排序

DRF提供过滤器帮助我们快速对字段进行搜索和排序。

搜索测试:http://127.0.0.1:8001/myapp_api/api/user?search=阿哲

排序测试:http://127.0.0.1:8001/myapp_api/api/user?ordering=id

注:默认是正序排列,字段前面加横杠(例如-id)表示倒序排列

分页

分页是数据表格必备的功能,可以在前端实现,也可以在后端实现,为了避免响 应数据过大,造成前端压力,一般在后端实现。

REST_FRAMEWORK ={
#分页
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 3 , # 每页数目
}

默认分页器灵活度不高,例如不能动态传递每页条数,可以通过重写 PageNumberPagination类属性改变默认配置。

myapp_api/pagination.py

DRF配置指定模块路径:

测试:http://127.0.0.1:8001/myapp_api/api/user?page_num=2&page_size=3

自动生成接口文档

由于项目开发经验欠缺或着急上线,需求不断改动,项目设计阶段定义的接口已经面目全非,这给 前端开发人员参考带来一定困难,如何改善这个问题呢?

Swagger来了,它是一个应用广泛的REST API文档自动生成工具,生成的文档可供前端人员查看。

文档参考:https ://django-rest-swagger.readthedocs.io/en/latest/

安装:

pip install django-rest-swagger

添加APP:

INSTALLED_APPS = [
...
'rest_framework_swagger',
]

DRF配置:

REST_FRAMEWORK = {
# API接口文档
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}

URL路由:

from rest_framework_swagger.views import get_swagger_view
schema_view = get_swagger_view(title='接口文档')
urlpatterns += [
re_path('^docs/$', schema_view),
]