APIView
APIView基本使用
1.drf:第三方app
2.cbv的视图类:继承APIView类及其子类
3.基于View与JsonResponse的视图类
4.继承APIView+drf+Response的视图类(drf是app需要在settings配置文件中注册)
4.1 无crsf校验
4.2 APIView继承了View
4.3 代码操作
4.3.1 查询所有
4.3.2 查询单个
4.3.3 添加数据
4.3.4 修改数据
4.3.5 删除数据
APIView源码分析
1.APIView源码分析
class BookView(APIView):
def get(self, request):
return Response(book_list)
路由:path('books/', views.BookView.as_view())
1.1 路由匹配成功 执行views.BookView.as_view()()
1.2 查询as_view方法 自身没有 查询父类APIView as_view方法执行结果 取消了csrf校验 返回view
@classmethod
def as_view(cls, **initkwargs):
return csrf_exempt(view) # 相当于在函数上加装饰器取消csrf校验
# 在函数上加装饰器
@csrf_exempt
def inner(request):
pass
# 等同于 inner = csrf_exempt(inner)
1.3 查询view方法 自身没有 查询父类APIView 没有 查询继承的父类view view方法执行结果 self.dispatch方法
def view(request, *args, **kwargs):
return self.dispatch(request, *args, **kwargs)
1.4 查询dispatch方法 自身没有 查询父类APIView
匹配请求类型 转为小写 查询是否存在该请求类型 有 通过反射获取 传入request方法返回执行请求方法
def dispatch(self, request, *args, **kwargs):
# dispatch方法中的参数request是django原生的request
request = self.initialize_request(request, *args, **kwargs)
# 重新赋值后的变量request是drf提供的Request类的对象
# self是视图类的对象
self.request = request # request是新的request
self.headers = self.default_response_headers # deprecate?
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
1.5 查询请求方法 执行
class BookView(APIView):
def get(self, request):
return Response(book_list)
APIView:1.继承后就没有csrf认证
2.视图类中使用的request对象是drf提供的Request类的对象
3.执行视图类的方法之前 执行了3大认证(认证,权限,频率)
4.在执行三大认证和视图类的方法过程中只要报错 都会被捕获处理
Request类源码分析
1.Request类源码分析
1.Request类:视图类继承APIView 视图类中使用的request对象是drf提供的Request类的对象
from rest_framework.request import Request
2.原生django的request对象:from django.core.handlers.wsgi import WSGIRequest
3.Request类对象和原生django的request方法使用方式一样
request.method
request.path
request.POST
request.GET
4.Request类的源码分析:from rest_framework.request import Request
4.1 利用反射(根据字符串获取属性或方法) self._request是原来的request
class Request:
def __init__(self, request, parsers=None, authenticators=None,
negotiator=None, parser_context=None):
self._request = request # 原来的request
def __getattr__(self, attr): # __getattr__ 魔法方法 获取的属性值不存子啊时执行
# 如果查询的属性不存在就去原生django中查询
try:
return getattr(self._request, attr)
# 利用反射(根据字符串获取属性或方法) self._request是原来的request
except AttributeError:
return self.__getattribute__(attr)
4.2 data方法 被property装饰 变成了属性
4.2.1 视图类继承View时
body中提交的数据——request.POST获取
urlencoded,form_data——request.POST
json格式提交数据——request.body
4.2.2 视图类继承APIView时 通过data方法
无论哪种数据类型——request.data
@property
def data(self):
if not _hasattr(self, '_full_data'):
self._load_data_and_files()
return self._full_data
4.3 query_params是get请求的参数==request._request.GET或request.GET
@property
def query_params(self):
"""
More semantically correct name for request.GET.
"""
return self._request.GET
4.4 文件类型从request.FILES中获取
注:魔法方法:在类中以__开头 __结尾的称之为魔法方法
当达到某些条件时自动触发
如__init__ 实例化
__str__ 打印
__call__ 对象加括号
序列化
序列化组件介绍
1.序列化组件:用来序列化request对象或单个对象
2.序列化:序列化器会把模型类对象转换成字典 经过response变成json字符串
3.反序列化:把提交的数据经过request变成字典 序列化器可以把字典转成模型类对象
注:drf提供一种可以快速序列化的类:序列化类
序列化组件的基本使用
1.定义序列化类(序列化的字段) 写几个字段就序列化几个字段
2.使用序列化类(序列化多条数据)
3.使用序列化(序列化单条数据)
反序列化
1.视图类
2.序列化类
1.装饰在视图函数,只要一装饰,之后的request就可以使用request.data,这个data无论是那种编码格式,都有数据
def auth(func_name):
def inner(request, *args, **kwargs):
try:
request.data = json.loads(request.body)
except:
request.data = request.POST
res = func_name(request, *args, **kwargs)
return res
return inner
@auth
def book(request):
book_list_obj = models.Book.objects.all()
book_list = []
for book in book_list_obj:
book_list.append({'name': book.name, 'price': book.price, 'publish': book.publish})
return JsonResponse(book_list, safe=False, json_dumps_params={'ensure_ascii': False})
标签:02,__,request,self,APIView,视图,序列化,drf
From: https://www.cnblogs.com/040714zq/p/16732827.html