drf常用功能
761字约3分钟
主流认证方式
主流认证方式:
- 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),
]
