简介
- 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=18jquery中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 |
参考文章
