APIView基本使用
使用drf,那么写的都是cbv, 但是都是继承drf提供的视图类,APIView
from rest_framework.views import APIView
"""drf是个app, 需要注册"""
INSTALLED_APPS = [
....
'rest_framework']
# app后不加, 不使用""""""加注释
### 补充:django项目中app的作用---》django是一个大而全的框架---》内置了很多app--》帮咱们完成了很多事---》数据库迁移,多了很多表,不是写的
INSTALLED_APPS = [
'django.contrib.admin', # 后台管理,系统自带后台管理admin
'django.contrib.auth', # 权限管理--》生成6张表
'django.contrib.contenttypes',# 对所有app的表进行记录的
'django.contrib.sessions', # session功能--》django-session表---》app
'django.contrib.messages', # django消息框架---》flask的闪现
'django.contrib.staticfiles', # 静态资源
'app01.apps.App01Config',
'rest_framework', # 一定不要忘了注册
]
APIView执行流程分析
#######流程分析
# path('books/', views.BookViwe.as_view())
# views.BookViwe.as_view()的执行结果,是函数内存地址----》view这个函数的内存地址
# 现在的as_view已经不是django原生View的as_view了----》面向对象中 属性查找顺序---》而是drf的APIView的as_view了
#### 路由写法没变----》执行发生了变化 ####
# 请求来了---》路由匹配成功----》会执行 这个函数---》view(request)
#### 派生方法:子类中重写父类中的方法或者新写方法 叫派生
### 派生类---》子类
def as_view(cls, **initkwargs): # as_view是django的View的派生方法
# 这个view就是原生django中View类的view,还是原来的view
view = super().as_view(**initkwargs)
# csrf_exempt--->去除了所有的csrf---》csrf中间件---》post提交数据,如果不注释---》协带csrf---》以后,无论中间件是否注释,都不需要带了
# csrf_exempt装饰器装饰视图函数--->本质跟csrf_exempt(view)一毛一样
# 它就是装饰器的本质:把被装饰的函数当做参数,传入装饰器函数,返回值赋值给被装饰的函数
return csrf_exempt(view)
###### 重点:1 view还是原来的view,2 以后不用管csrf了
# dispatch---》已经不是django原生View的dispatch了,是drf的APIView的dispatch了---》查找顺序的问题
def dispatch(self, request, *args, **kwargs):
#1 包装了新的request对象--》以后视图类中用的request对象,就是新的request
request = self.initialize_request(request, *args, **kwargs)
try: # 捕获了异常
# 内部执行了三大认证:认证(登陆认证),频率(1分钟只能访问接口3次),权限(普通用户不能访问,超级用户才能访问)
self.initial(request, *args, **kwargs)
# 原来dispatch的代码,重写了一下---》执行视图函数
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)
# 包装了response对象,响应对象,浏览器看到好看的样子,postman只看到json
self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response
#### 重点
-1 drf:包装了新的request对象(drf的Request的对象了),已经不是django 的request对象了
# rest_framework.request.Request 以后新的request
# django.core.handlers.wsgi.WSGIRequest django原来的
-2 在执行视图函数之前,执行了三大认证
-3 处理了全局异常 ---》执行三大认证期间,执行视图函数期间,如果出了错,都能统一处理
-4 包装了响应对象
