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

posted @ 2024-07-10 13:32  khalil12138  阅读(6)  评论(0编辑  收藏  举报