2. DRF Request对象
目录
Django Request和参数
1. 属性
1.1 先学习下面向对象知识点
获取对象中的成员时,本质上会调用 __getattribute__
方法,默认我们不定义就用父类中的
class Request(object):
def __init__(self, req, xx):
self._request = req
self.xx = xx
obj = Request(1, 2)
print(obj.xx)
print(obj._request)
class Request(object):
def __init__(self, req, xx):
self._request = req
self.xx = xx
def __getattribute__(self, item):
print("执行__getattribute__", item)
return super().__getattribute__(item)
obj = Request(1, 2)
print(obj.xx)
print(obj._request)
# int(obj.v1) # 报错
# 注意:如果不是对象中的成员,就会报错。
不过想要访问对象中不存在成员,则可以通过定义 __getattr__
实现。
- 先执行自己的
__getattribute__
- 再执行父类的
__getattribute__
- 是自己对象,直接获取并返回
- 不是自己对象,调用
__getattr__
class Request(object):
def __init__(self, req, xx):
self._request = req
self.xx = xx
def __getattribute__(self, item):
print("执行__getattribute__", item)
return super().__getattribute__(item)
def __getattr__(self, item):
print("__getattr__", item)
return 999
obj = Request(1, 2)
print(obj.xx)
print(obj._request)
print(obj.v1)
下面代码模拟了Request对象的封装过程
class HttpRequest(object):
def __init__(self):
pass
def v1(self):
print("v1")
def v2(self):
print("v1")
class Request(object):
def __init__(self,req, xx):
self._request = req
self.xx = xx
def __getattr__(self, attr):
try:
return getattr(self._request, attr)
except AttributeError:
return self.__getattribute__(attr)
request = HttpRequest()
request.v1()
request.v2()
request = Request(request,111)
request.v1()
request.v2()
2. 源码分析
2.1 drf 中的 如何和流程
views.py如果使用drf的CBV实现视图类需要继承DRF的APIView方法
urls.py中当请求匹配到url会执行as_view方法
因为Home2没有定义as_view方法,所以需要去父类中寻找
2.2 drf 中的新的Request 和 django中的老Request
老的Request会经过self.finalize_response方法进行处理变成新的request