文章目录

  • 一、主流认证方式
  • Session认证
  • Token认证
  • JWT认证
  • 二、DRF认证与权限
  • Session认证
  • 所有视图(全局)启用认证
  • 视图级别启用认证
  • Token认证[`推荐`]
  • 安装APP
  • 启用Token认证
  • 生成数据库表(因为token要存储到数据库)
  • 配置Token认证接口URL
  • 获取token
  • 使用token去访问API接口
  • 重写ObtainAuthToken
  • 创建myapp/obtain_auth_token.py
  • 修改myapp/urls.py
  • 三、限流
  • 四、过滤
  • 安装django-filter模块
  • 添加APP
  • 添加DRF配置
  • 在视图中指定过滤的字段
  • 五、搜索和排序
  • 六、分页
  • 重写PageNumberPagination类
  • 七、自动生成接口文档
  • 安装django-rest-swagger模块
  • 添加APP:
  • DRF配置
  • 配置libraries
  • 配置URL路由:
  • 效果
  • 参考



一、主流认证方式

Session认证

DRF 常用功能_DRF限流、认证

Token认证

Cookie+Session通常在浏览器作为客户端的情况下比较通用,随着前后端分离开发模式的普及,会涉及到多端(PC、APP、Pad),特别是手机端,支持Cookie不友好,并且Cookie不支持跨域,因此基于这些局限性,Token逐渐主流。

DRF 常用功能_DRF限流、认证_02

JWT认证

与普通Token一样,都是访问资源的令牌,区别是普通Token服务端验证token信息要查询数据库验证,JWT验证token信息不用查询数据库,只需要在服务端使用密钥效验。

DRF 常用功能_DRF限流、认证_03

二、DRF认证与权限

DRF支持四种认证方式:

• BasicAuthentication:基于用户名和密码的认证,适用于测试
• SessionAuthentication:基于Session的认证
• TokenAuthentication:基于Token的认证
• RemoteUserAuthentication:基于远程用户的认证

DRF支持权限:

• IsAuthenticated:只有登录用户才能访问所有API
• AllowAny:允许所有用户
• IsAdminUser:仅管理员用户
• IsAuthenticatedOrReadOnly:登录的用户可以读写API,未登录用户只读

Session认证

由于Django默认提供Session存储机制,可直接通过登录内置管理后台进行验证。
当登录管理后台后,就有权限访问了

所有视图(全局)启用认证

在settings.py下面添加如下内容:

# DRF配置
REST_FRAMEWORK = {
    # 认证方式
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
    ],
    # 设置权限
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}

视图级别启用认证

DRF 常用功能_DRF 常用功能_04

Token认证[推荐]

安装APP

打开settings.py,添加rest_framework.authtoken

DRF 常用功能_django_05

启用Token认证

# DRF配置
REST_FRAMEWORK = {
    # 认证方式
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
    # 设置权限
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}

生成数据库表(因为token要存储到数据库)

python manage.py migrate

配置Token认证接口URL

在myapp/urls.py下面添加

from rest_framework.authtoken import views
urlpatterns += [
    re_path('^api-token-auth/', views.obtain_auth_token)
]

获取token

打开APIPost

DRF 常用功能_分页_06


URL地址:http://127.0.0.1:8000/myapp/api-token-auth/

用户名密码:

{
    "username": "admin",
    "password": "admin"
}

DRF 常用功能_django_07


会得到一个token:cd2c67838cd59a321a4e5000ad7ab00632386229

DRF 常用功能_REST_08

使用token去访问API接口

URL:http://127.0.0.1:8000/myapp/api/project/

DRF 常用功能_DRF 常用功能_09


可正常返回结果

DRF 常用功能_DRF 常用功能_10

重写ObtainAuthToken

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

创建myapp/obtain_auth_token.py
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Response

class CustomAuthToken(ObtainAuthToken):
    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response({
            'token': token.key,
            'username': user.username
        })
修改myapp/urls.py
from myapp.obtain_auth_token import CustomAuthToken
urlpatterns += [
    re_path('^api-token-auth/', CustomAuthToken.as_view())
]

三、限流

可以对接口访问的频率进行限制,以减轻服务器压力。
应用场景:投票、购买数量等

在settings.py的REST_FRAMEWORK下面添加如下内容:

# 限流:范围
   'DEFAULT_THROTTLE_CLASSES': (
       'rest_framework.throttling.AnonRateThrottle',   # 未登录用户
       'rest_framework.throttling.UserRateThrottle'    # 已登录用户
   ),
# 限流:访问频率
 'DEFAULT_THROTTLE_RATES': {
     # 周期:second,minute,hour,day
     'anon': '3/minute', # 针对未登录用户进行限制,每分钟最多访问3分钟,基于IP区分用户
     'user': '5/minute', # 针对登录用户进行限制,每分钟最多访问5次,基于用户ID区分
 }

四、过滤

对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持。
文档:https://www.django-rest-framework.org/api-guide/filtering/

安装django-filter模块

pip install django-filter

添加APP

INSTALLED_APPS = [
	...
	'django_filters'
]

添加DRF配置

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

在视图中指定过滤的字段

DRF 常用功能_分页_11

五、搜索和排序

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

DRF 常用功能_DRF 常用功能_12

六、分页

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

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

重写PageNumberPagination类

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

创建myapp/pagination.py

from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response

class MyPagination(PageNumberPagination):
    page_size = 10  # 默认每页显示多少条数据
    page_query_param = 'page_num'   # 指定URL查询第几页的关键字名称,默认为"page"
    page_size_query_param = 'page_size' # 指定URL查询(每页显示多少条数据)关键字名称,默认为None
    max_page_size = 50  # 每页最多显示多少条数据

    # 重写分页响应数据
    def get_paginated_response(self, data):
        self.code = 200
        msg = '成功'
        if not data:
            code = 404
            msg = '没有发现数据'

        return Response({
            'code': code,
            'msg': msg,
            'count': self.page.paginator.count,
            'data': data
        })

DRF配置指定模块路径

REST_FRAMEWORK = {
	…………
	'DEFAULT_PAGINATION_CLASS': 'myapp.pagination.MyPagination',
}

DRF 常用功能_DRF限流、认证_13

七、自动生成接口文档

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

安装django-rest-swagger模块

pip install django-rest-swagger

添加APP:

INSTALLED_APPS = [
	...
	'rest_framework_swagger',
]

DRF配置

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

配置libraries

在setting.py中添加如下内容:

'libraries': {  # Adding this section should work around the issue.
    'staticfiles': 'django.templatetags.static',
},

DRF 常用功能_REST_14

配置URL路由:

myapp/urls.py

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

效果

DRF 常用功能_分页_15