官方文档
Demo
为了更好的记录学习 DRF 的全过程,针对 DRF 编写了一个 Demo示例项目,相关环境、GitHub仓库如下:
环境
- Django 4.0.4
- django-rest-framework 3.13.1
- MySQL 8.0
- python-dateutil 2.8.2
- mysqlclient 2.1.0
仓库
API文档
介绍
概念
django rest framework
是基于 Django
实现的⼀个 RESTful
风格 API 框架,能够帮助我们快速开发 RESTful
风格的 API。
特点
- 提供了定义序列化器,可以快速根据 Django ORM 或者其他库自动序列化、反序列化;
- 提供了丰富的类视图、MIXIN扩展类,根据需求组合继承,简化视图的编写;
- 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
- 支持多种身份认证和权限认证方式;
- 内置了限流系统;
- 可视化API接口;
- 可扩展性好,插件丰富。
安装
安装依赖
- Python(3.5以上)
- Django(2.2以上)
DRF是以Django子应用的方式提供的,需要注册到settings.py中,所以可以使用已有的Django环境而无需重新创建(若没有Django环境,需要先创建环境安装Django)。
pip install django -i https://pypi.douban.com/simple
安装 DRF
pip install djangorestframework -i https://pypi.douban.com/simple
配置
注册DRF
在项目目录下的 settings.py
的 INSTALLED_APPS
中添加 rest_framework
,将 rest_framework
应用注册到项目中。
# 项目名称/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework'
]
DRF框架配置(非必须)
DRF框架配置会在后续的教程中逐一介绍,这里可以先行跳过。
# 项目名称/settings.py
REST_FRAMEWORK = {
# 文档报错: AttributeError: ‘AutoSchema’ object has no attribute ‘get_link’
# 用下面的设置可以解决
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
# 默认设置是:
# 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.openapi.AutoSchema',
# 异常处理器
# 'EXCEPTION_HANDLER': '',
# 非drf的原始的认证方式是: 账号密码->cookie(session)
# drf用户认证方式需要自行配置
'DEFAULT_AUTHENTICATION_CLASSES': [],
# 权限配置, 顺序靠上的严格, 全部通过才有权限
'DEFAULT_PERMISSION_CLASSES': [
# 职员可以访问() is_staff=True
'rest_framework.permissions.IsAdminUser', # 管理员可以访问
# 认证用户可以访问 is_active=True, 登录的人
'rest_framework.permissions.IsAuthenticated',
# 认证用户可以访问, 否则只能请求安全方法 SAFE_METHODS = ('GET', 'HEAD', 'OPTIONS')
'rest_framework.permissions.IsAuthenticatedOrReadOnly',
# 所有用户都可以访问
'rest_framework.permissions.AllowAny',
],
# 限流
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle', # 匿名用户限流
'rest_framework.throttling.UserRateThrottle', # 认证用户限流
],
# 限流策略
'DEFAULT_THROTTLE_RATES': {
'user': '1000/hour',
'anon': '300/day',
},
# 全局分页器, 例如 省市区的数据自定义分页器, 不需要分页
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
# 每页返回数量
'PAGE_SIZE': 10, # 默认 None
# 过滤器后端
'DEFAULT_FILTER_BACKENDS': [
'django_filters.rest_framework.DjangoFilterBackend',
# 'django_filters.rest_framework.backends.DjangoFilterBackend', 包路径有变化
],
# Filtering 过滤排序
'SEARCH_PARAM': 'search',
'ORDERING_PARAM': 'ordering',
# Authentication 认证
# 未认证用户使用的用户类型, 如果认证失败了, 那么用户身份是 下面这个配置指定的身份
'UNAUTHENTICATED_USER': 'django.contrib.auth.models.AnonymousUser',
# 未认证用户使用的Token值
'UNAUTHENTICATED_TOKEN': None,
}