Django RestFramework
(DRF)基于django框架開發(fā)的(pip install restframework
),常用的功能有【解析,認(rèn)證,序列化谒拴,視圖組,分頁(yè)】等涉波,接下來就從APIView入手英上,看一下這幾個(gè)功能。
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中有一個(gè)data屬性
return HttpResponse("POST")
APIView的作用 (以下鏈接):
對(duì)請(qǐng)求進(jìn)行封裝啤覆,生成新的request對(duì)象苍日,有了
request.data方法
進(jìn)行
認(rèn)證、 權(quán)限窗声、 頻率
1相恃,自定義的CBV在url中,調(diào)用了
as_view()
方法嫌佑。但是自己的類里沒有此方法豆茫,所以找父類里的APIView
里-
2侨歉,
APIView
里有此方法屋摇,但是是執(zhí)行了父類View 的 as_view
方法揩魂,并且返回了view 函數(shù)
,加上了幾個(gè)屬性@classmethod def as_view(cls, **initkwargs): view = super(APIView, cls).as_view(**initkwargs) view.cls = cls view.initkwargs = initkwargs return csrf_exempt(view)
-
3炮温,請(qǐng)求到來火脉,執(zhí)行
view 函數(shù)
,返回dispatch
的執(zhí)行結(jié)果柒啤,一定要認(rèn)清self.dispatch
中的self
是誰(shuí)倦挂,是自定義的類的實(shí)例對(duì)象def view(request, *args, **kwargs): self = cls(**initkwargs) return self.dispatch(request, *args, **kwargs)
4,自定義的類中沒有此
dispatch
方法担巩,所以找父類APIView
中的方法方援,有此方法,所以涛癌,這個(gè)dispatch
用的是APIView 中的 dispatch
方法犯戏,有以下功能-
5,APIView中的dispatch
def dispatch(self, request, *args, **kwargs): 【1】重新封裝request對(duì)象拳话,之后再用request都是新的先匪,有了request.data屬性 request = self.initialize_request(request, *args, **kwargs) self.request = request self.headers = self.default_response_headers # deprecate? try: 【2】認(rèn)證 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】最后還是返回了反射后的執(zhí)行結(jié)果,此部分和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