简介
- django-rest-framework,是一套基于Django 的 REST 框架,是一个强大灵活的构建 Web API 的工具包
- 官网
pip3 install djangorestframework
安装- 10大特性:权限、认证、节流、版本控制、解析器、序列化、分页、视图、路由、渲染器
rest framework
主要基于CBV模式,且大部分特性是基于必须是继承了APIView;FBV模式时上述特性无法体现。 FBV/CBV参考:http://blog.aezo.cn/2018/09/24/lang/python/django.md
认证
可参看下文rest framework 源码解析【封装request和认证】。源码参考[A03_DjangoRestFrameworkTest]
- 自定义认证类
1 | from rest_framework import exceptions |
- 全局认证类配置
1 | # setting.py |
- 局部认证类配置
1 | class NoAuthView(APIView): |
- 基于token生成的认证
1 | ## smtest/models.py 实体 |
使用rest framework认证模块
- setting.py配置
1 | INSTALLED_APPS = [ |
- MyTokenAuthentication
1 | # myproject/utils/auths.py |
- urls.py
1 | from myproject.utils.auths import BizTokenBackend |
权限
可参看下文rest framework 源码解析【封装request和认证,权限】。源码参考[A03_DjangoRestFrameworkTest]
- 自定义权限类
1 | ## smtest/utils/permission.py |
- 全局权限类配置
1 | # setting.py |
- 局部权限类配置
1 | class OrderView(APIView): |
访问控制/节流
可参看下文源码解析【封装request和认证,权限】。源码参考[A03_DjangoRestFrameworkTest]
- 自定义节流类
1 | from rest_framework.throttling import BaseThrottle, SimpleRateThrottle |
- 全局限流配置
1 | REST_FRAMEWORK = { |
- 局部限流配置
1 | class OrderView(APIView): |
版本控制
原理类似认证。源码参考[A03_DjangoRestFrameworkTest2]
- 全局配置
1 | REST_FRAMEWORK = { |
- url配置
1 | urlpatterns = [ |
- 版本获取
1 | from django.shortcuts import render, HttpResponse |
解析器
源码参考[A03_DjangoRestFrameworkTest2]
- 全局配置
1 | REST_FRAMEWORK = { |
- 局部配置及获取数据
1 | class ParserTest(APIView): |
- django请求头相关
request.POST
中有值(从request.body
中取值的)的前提- 请求头必须是
application/x-www-form-urlencoded
- 请求数据格式必须是
name=smalle&age=18
- 请求头必须是
<form>
和ajax
默认都是application/x-www-form-urlencoded
<form>
的请求格式即为name=smalle&age=18
jquery
中ajax
的data
属性传入的值尽管是json对象,但是jquery内部会转换成name=smalle&age=18
- 将ajax的请求头改成
application/json
,此时request.POST
中无值(data何种形式都不行),request.body
中有值
序列化
原理参考下文。源码参考[A03_DjangoRestFrameworkTest2]
- 实体不序列返回时容易出现类似
<Django object > is not JSON serializable
的错误。方法如下- 对于字典类型
return JsonResponse(data)
通过 django.http.JsonResponse 返回 - 定义序列化类
- 对于字典类型
定义序列化操作器
-继承Serializer
或ModelSerializer
1 | from rest_framework import serializers |
提交数据验证
- 前台提交的数据会保存在
serializer.initial_data
,然后根据校验规则进行校验,通过的字段保存到serializer.validated_data
。最后根据serializer.validated_data
进行数据保存
1 | class StartsWithValidator: |
分页
源码参考[A03_DjangoRestFrameworkTest2]
1 | from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination |
渲染器
源码参考[A03_DjangoRestFrameworkTest2]
- 注册rest_framework
1 | INSTALLED_APPS = [ |
- 全局配置
1 | REST_FRAMEWORK = { |
- 使用
Response
返回数据
1 | from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer, AdminRenderer |
- 访问
http://127.0.0.1:8000/api/v1/group_serializer/1
在浏览器(api页面)和postman(json数据)中可自动识别http://127.0.0.1:8000/api/v1/group_serializer/1?format=api
返回api页面(包含结果数据)http://127.0.0.1:8000/api/v1/group_serializer/1?format=json
只返回json数据
- 修改api模板可参看下文渲染器源码解析
视图
源码参考[A03_DjangoRestFrameworkTest2]
ModelViewSet
路由配置
1 | # url(r'^(?P<version>[v1|v2]+)/view_test/$', views.GenericViewTest.as_view({'get': 'list', 'post': 'create'})), |
ModelViewSet
视图子类
1 | from rest_framework.generics import GenericAPIView |
路由
1 | ## urls.py |
过滤器
- settings.py
1 | INSTALLED_APPS = [ |
django-url-filter 过滤插件(推荐)
pip install django-url-filter
安装插件(可不用引入到INSTALLED_APPS)
1 | from url_filter.integrations.drf import DjangoFilterBackend |
django-filter 过滤插件
pip install django-filter
安装django-filter过滤器插件- views.py
1 | from django_filters.rest_framework import DjangoFilterBackend |
- 自定义过滤器
- 基于
django_filters
插件实现 - filters.py(配合filterset_class使用)
- 基于
1 | from django_filters import rest_framework as filters # 注意导入路径,是从rest_framework中导入 |
SearchFilter 模糊匹配进行过滤
- rest-framework内置。类似django admin的搜索,所有字段均使用一个
search
参数传入,此参数名可通过修改api_settings.SEARCH_PARAM
进行覆盖
1 | from rest_framework import filters |
OrderingFilter 排序过滤
- rest-framework内置
1 | from rest_framework import filters |
其他
跨域
- 使用
corsheaders
,参考:https://github.com/ottoyiu/django-cors-headers/ pip install django-cors-headers
安装- setting.py配置
1 | INSTALLED_APPS = ( |
异常处理
1 | ## settings.py |
禁用crsf
1 | MIDDLEWARE = [ |
统一结果返回
rest framework 源码解析
封装request和认证 ^1
- CBV模式下视图类继承rest_framework的
APIView
对象(继承了django的View对象),所有的请求也会先进入到self.dispatch()
方法。封装request和认证过程如下
1 | ## rest_framework/views.py |
权限
1 | ## rest_framework/views.py |
访问控制/节流
1 | ## rest_framework/views.py |
- 内置节流类(
SimpleRateThrottle
)
1 | ## rest_framework/throttling.py |
视图
- 继承关系
django
应该可以继承View
,rest framework
应用可以使用下面所有视图类。常用:ModelViewSet
、GenericViewSet
、APIView
- 使用django View时,对应url方法默认是调用
View.as_view()
方法
- 源码说明 ^2
1 | ## rest_framework/viewsets.py |
序列化
1 | # 1.序列化处理对象 |
渲染器
1 | # rest_framework/renderers.py |
参考文章