目录
如何从前端取值?
-
地址栏中取
request.query_params.get('token')
-
原生django,取出前端传入的cookie,在哪里取到?
request.COOKIE.get.('sessionid')
-
后期如果想从请求头中取
request.META.get('HTTP_TOKEN') 后台书写的小写token都会统一变成大写的TOKEN+ HTTP_
原生djang的cookie+session认证底层原理
断点调试使用
程序是 debug模式运行,可以在任意位置停下,查看当前情况下变量数据的变化情况
pycharm调试程序
以debug形式运行
代码行左侧可以加入断点---红圈
step over 单步调试
step into 进入到函数内部运行
绿色箭头 快速调到下一个断点
异常处理
APIView---dispatch----三大认证,在执行视图类的方法,如果处理异常,就会被异常捕获,捕获之后会统一处理。因为drf内置了一个函数,只要过程出了异常,就会执行这个函数handle_exception
,这个函数只处理drf的异常
由上面可知,最后drf抛异常处理的是在配置里面,如果不管是主动抛异常还是程序运行出错,都统一返回规定的格式,那么就需要在加载系统配置前先加载项目配置文件里,
drf
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
项目配置
'EXCEPTION_HANDLER': 'app01.exception.common_exception_handle',
-主动抛的非drf异常
-程序出错了 ,都不会被处理
我们的目标,无论主动抛还是程序运行出错,都同意返回规定格式--》能记录日志
公司里一般返回 {code:999,'msg':'系统错误,请联系系统管理员'}
# exception.py
from rest_framework.views import exception_handler
from rest_framework.response import Response
def common_exception_handle(exc, context):
# exc 错误对象
# context:上下文,有view:当前出错的视图类的对象,args和kwargs视图类方法分组出来的参数,request:当次请求的request对象
# 只要走到这里,就要记录日志 ,只有错了,才会执行这个函数
# 记录日志尽量详细
print(context)
"""{'view': <app01.views.BookView object at 0x000001E1E3C98550>,
'args': (), 'kwargs': {}, 'request': <rest_framework.request.Request: GET '/api/v1/books/'>}"""
print('时间,登录用户id,用户ip,请求方式,请求地址,执行的视图类,错误原因')
res=exception_handler(exc, context)
if res: # 如果有值,说明返回了Response对象,没有值说明返回了None
# 如果是Response对象是drf的异常,已经被处理,如果是None表明没有被处理,说明是非drf异常
res = Response(data={'code':888,'msg':res.data.get('detail','请联系管理员')})
else:
res =Response(data={'code':999,'msg':str(exc)})
# 记录日志
res = Response(data={'code':888,'msg':'系统错误,前联系管理员'})
return res
# 视图类
class BookView(ViewSetMixin,APIView):
def list(self,request):
# 主动抛drf的异常
# raise APIException('我是drf异常')
# 主动抛非drf异常
raise Exception('我是非DRF异常')
books = Book.objects.all()
.......