Django RestFramework
(DRF)基于django框架开发的(pip install restframework
),常用的功能有【解析,认证,序列化,视图组,分页】等,接下来就从APIView入手,看一下这几个功能。
import json
from django.shortcuts import HttpResponse
from rest_framework.views import APIView
from .models import Course
class CourseView(APIView):
def get(self, request):
course_list = Course.objects.all()
ret = []
for course in course_list:
ret.append({
"title": course.title,
"desc": course.desc,
})
return HttpResponse(json.dumps(ret, ensure_ascii=False))
def post(self, request):
print(request.data) # 新的request中有一个data属性
return HttpResponse("POST")
APIView的作用 (以下链接):
对请求进行封装,生成新的request对象,有了
request.data方法
进行
认证、 权限、 频率
-
1,自定义的CBV在url中,调用了
as_view()
方法。但是自己的类里没有此方法,所以找父类里的APIView
里 -
2,
APIView
里有此方法,但是是执行了父类View 的 as_view
方法,并且返回了view 函数
,加上了几个属性@classmethod def as_view(cls, **initkwargs): view = super(APIView, cls).as_view(**initkwargs) view.cls = cls view.initkwargs = initkwargs return csrf_exempt(view)
-
3,请求到来,执行
view 函数
,返回dispatch
的执行结果,一定要认清self.dispatch
中的self
是谁,是自定义的类的实例对象def view(request, *args, **kwargs): self = cls(**initkwargs) return self.dispatch(request, *args, **kwargs)
-
4,自定义的类中没有此
dispatch
方法,所以找父类APIView
中的方法,有此方法,所以,这个dispatch
用的是APIView 中的 dispatch
方法,有以下功能 -
5,APIView中的dispatch
def dispatch(self, request, *args, **kwargs): 【1】重新封装request对象,之后再用request都是新的,有了request.data属性 request = self.initialize_request(request, *args, **kwargs) self.request = request self.headers = self.default_response_headers # deprecate? try: 【2】认证 self.initial(request, *args, **kwargs) # Get the appropriate handler method 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 【3】最后还是返回了反射后的执行结果,此部分和View中的方法一样 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
网友评论