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('返回成功.')



3 源码分析

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


浙公网安备 33010602011771号