03 DRF-request对象和参数

1 oop知识补充

  • __getattr__
    class Foo(object):
    	def __init__(self, name, age):
    		self.name = name
    		self.age = age
    
    	def show(self):
    		return 123
    
    	def __getattr__(self, item):
    		# 当访问该对象中不存在的成员时,会执行
    		print("--->", item)
    		return 999
    
    
    obj = Foo('lxx', 12)
    # print(obj.name)
    # print(obj.age)
    # print(obj.show())
    
    # 反射
    # v1 = getattr(obj, 'show', '')
    # print(v1)  # 取值或执行方法,第3个参数取不到时返回。
    
    print(obj.xxx)  # 触发__getattr__
    

  • __getattribute__
    class Foo(object):
    	def __init__(self, name, age):
    		self.name = name
    		self.age = age
    
    	def show(self):
    		return 123
    
    	def __getattribute__(self, item):
    		# 不管访问的成员存不存在都会执行
    		print('--->', item)
    		# return 999
    
    
    obj = Foo('lxx', 12)  # {'name': 'lxx', 'age': 12}
    print(obj.name)  # 999
    print(obj.age)  # 999
    print(obj.xxx)  # 999
    # 只要执行 对象.xxxx 都会执行
    # - 对象中有值,返回
    # - 对象中无值,报错
    

应用:

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 request传参

url 请求传参传递

urlpatterns = [
    path('user/<int:v1>/', views.UserView.as_view()),
]
class UserView(APIView):
    def get(self, request, *args, **kwargs):  # 方式1接收
        print(self.args)
        return Response('返回成功.')

# ----------------------------------------------------------

class UserView(APIView):
    def get(self, request, v1):  # 方式2接收
        return Response('返回成功.')

urlpatterns = [
    re_path('user/(\d+)/', views.UserView.as_view()),
	re_path('edit/(?P<pid>\d+)/', views.UserView.as_view()),
]
class UserView(APIView):
    def get(self, request, pid):
        print(request.user)  # 当前登录的用户  --> 匿名用户
        print(request.auth)
        return Response('返回成功.')

image

image

image


3 源码分析

image


4 request对象

drf中的request其实是对请求的再次封装,其目的就是在原来的request对象基础中再进行封装一些drf中需要用到的值。

image

posted @ 2022-10-17 14:41  角角边  Views(76)  Comments(0)    收藏  举报