Django Rest Framework
web的两种开发模式#
前后端分离: 只专注于写后端接口,返回json,xml格式数据
- 业务服务器和静态服务器是分开的
前后端不分离: 前后端混合开发 返回的是html页面 需要写模板
- 页面和数据都是由后端处理的
Restful规范#
安装和简单使用#
APIviews类的执行过程分析#
APIviews源码分析
Request对象#
序列化器的使用#
参数/描述 | |||||
---|---|---|---|---|---|
min_lenght | max_length | allow_blank | trim_whitespace | min_value | max_value |
最小长度 | 最大长度 | 是否允许为空 | 是否截断空白字符 | 最小值 | 最大值 |
局部校验和全局校验#
修改和多个修改#
删除和多个删除#
单个删除和多个删除都用一个方式删除
read_only和write_only#
查询所有和新增#
模型类序列化器#
serializers高级用法#
drf视图家族#
基于APIview写的接口#
基于GenericAPIview写的接口#
基于GenericAPIview和5个视图扩展类写的接口#
GenericAPIview的9个视图子类#
(终极版)使用ModelViewSet写5个接口#
自动生成路由#
action的使用#
三大认证#
认证#
自定义权限#
内置频率#
过滤#
安装#
注册#
全局配,或者局部配
视图配置#
第一种方式:
第二种方式:
写一个类
然后配置
案例: 区间过滤(沿用第二种方法,实现价格区间过滤)
了解 : django原生过滤 - 自定义过滤规则#
排序#
局部使用
异常处理#
drf帮我们封装了异常,没有封装处理的异常就交给django处理
但是处理的返回格式不符合咱们的要求,所以我们要统一接口返回
写一个自定义异常方法,替换掉全局,统一接口的返回
分页#
版本#
跨域#
由于浏览器具有"同源策略"的限制,如果在同一个域下发送ajax请求,浏览器的同源策略不会阻止,如果在不同域下发送ajax,浏览器的同源策略会阻止。
只要同时满足以下两大条件,就属于简单请求。
注意:同时满足以上两个条件时,则是简单请求,否则为复杂请求
简单请求:发送一次请求
复杂请求:发送两次请求 在发送数据之前会先发一次OPTIONS请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。
解决方法:CORS(跨站资源共享,本质是设置响应头)设置响应头解决跨越
方法一#
自己写个中间件
from django.utils.deprecation import MiddlewareMixinclass MvMiddle(MiddlewareMixin):def process_response(self, request, response):response['Access-Control-Allow-Origin'] = '*'if request.method == "OPTIONS":response["Access-Control-Allow-Headers"] = "Content-Type"return response然后中间件配置
MIDDLEWARE = [..."luffyapi.utils.middle.MyMiddle"]
方法二#
第三方解决方案
pip安装
pip install django-cors-headers注册
INSTALLED_APPS = (...'corsheaders',...)添加中间件
MIDDLEWARE = [ # Or MIDDLEWARE_CLASSES on Django < 1.10...'corsheaders.middleware.CorsMiddleware','django.middleware.common.CommonMiddleware',...]添加配置
CORS_ALLOW_CREDENTIALS = TrueCORS_ORIGIN_ALLOW_ALL = TrueCORS_ORIGIN_WHITELIST = ('*')CORS_ALLOW_METHODS = ('DELETE','GET','OPTIONS','PATCH','POST','PUT','VIEW',)CORS_ALLOW_HEADERS = ('XMLHttpRequest','X_FILENAME','accept-encoding','authorization','content-type','dnt','origin','user-agent','x-csrftoken','x-requested-with','Pragma',)
JWT(Json Web Token)#
一般在前后端分离时用于做认证(登陆)使用的技术,jwt的实现原理用户登陆成功之后会给前端返回一段token
第一段是类型和算法信息,第二段是用户信息和超时时间,第三段是sa256(前两段拼接)加密+base64url
将这三部分用.
连接成一个完整的字符串,构成了最终的jwt
以后前端再次发来信息时会有超时验证、token的合法性校验,优势就是token只在前端保存,后端只负责校验。
内部还集成了超时时间,后端可以根据时间校验是否超时 内部还存在hash256加密,所以用户不可以修改token,只要一修改就认证失败
流程#
用账号密码访问登录接口,登录接口逻辑中调用 签发token 算法,得到token,返回给客户端,客户端自己存到cookies中
校验token的算法应该写在认证类中(在认证类中调用),全局配置给认证组件,所有视图类请求,都会进行认证校验,所以请求带了token,就会反解出user对象,在视图类中用request.user就能访问登录的用户
注:登录接口需要做 认证 + 权限 两个局部禁用
安装
pip install djangorestframework-jwt注册
INSTALLED_APPS = (...'rest_framework_jwt',...)生成使用
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler# 根据user对象生成payload(中间值的数据)payload = jwt_payload_handler(user)# 构造前面数据,bose64加密;中间数据bose64加密;前两段拼接然后做hs256加密(加盐),再做base64加密,生成tokentoken = jwt_encode_handler(payload)
配置
REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework_jwt.authentication.JSONWebTokenAuthentication', # 全局配置,优先使用jwt的认证'rest_framework.authentication.SessionAuthentication','rest_framework.authentication.BasicAuthentication',),}JWT_AUTH = {'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), # 过期时间}局部配置
authentication_classes = [JSONWebTokenAuthentication, ] # 局部启用authentication_classes = [] # 局部禁用permission_classes = [IsAuthenticated, ] # 通过认证的用户延后认证(pass之后,只有当第一次通过request.user或request.auth才做认证)
class CartView(APIView):def perform_authentication(self, request):"""重写父类的用户验证方法,不在进入视图前就检查JWT"""pass
基于drf-jwt的全局认证:
app_auth.py
前端如何应用:
一般是在请求头里加入Authorization
,并加上Bearer
标注:
Bearer默认是JWT