url.py
path('books/', BookView.as_view())
view.py
class BookView(APIView):
pass
1.我们看自己是否有as_view()方法,没有,那我们就来到继承的APIView类中
view = super().as_view(**initkwargs)
return csrf_exempt(view)
在View中的dispatch方法的时候,我们需要先看APIView类中有没有该方法,来到APIView中的dispatch方法:
request = self.initialize_request(request, *args, **kwargs)
self.request = request
try:
self.initial(request, *args, **kwargs)
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
response = handler(request, *args, **kwargs)
except Exception as exc:
response = self.handle_exception(exc)
self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response
APIView类
1.包装新的request
2.执行了认证,权限,频率
3.处理了全局异常
4.包装了request对象
drf是一个第三方的app,只能在django中使用
安装好drf之后,需要导入APIView视图类,后期使用drf写视图类,都是继承了APIView视图类或其子类
当我们使用request.data的时候,三种数据格式的结果方式是
1.urldecoded和form_data的结果是QueryDict形式
2.Json的结果是字典
使用View和JsonResponse写
继承的是View
当我们使用APIView+drf的Response写的时候,我们不要忘记注册rest_framework这个app
继承APIView视图类,可以使用request.data
原生的request.POST中,只有urlencoded和form-data格式提交的数据可以获取到,json格式提交的数据在body中,需要我们自己处理;但是在drf中,request中有一个data,data中可以取到任意的编码提交的数据
request._request.GET -最初始的request。
request._request -新request
那么为什么新的request可以与老request执行结果相同。
因为触发了__getattr__魔法方法,何为魔法方法?不需要主动调用,某种状态下会触发。
__getattr__ 对象.属性 会触发并执行
def __getattr__(self, attr):
try:
return getattr(self._request, attr)
except