restframework api(基础3CBV)
2021-04-09 22:24
标签:api cbv ike raise end pass response proc names urls.py view.py 1)从上面的urls.py文件种可以看到,一个url对应了一个 这个views.OrderView.as_view()函数,并执行这个函数,也就是我们调用order的url会views.OrderView.as_view()() 2)从views.py文件种看到OrderView这个类种,并没有as_view()方法,所以需要到View类种找 restframework api(基础3CBV) 标签:api cbv ike raise end pass response proc names 原文地址:https://www.cnblogs.com/wanstack/p/9058012.html一 CBV源码流程
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r‘^order/‘, views.OrderView.as_view()),
]
from django.shortcuts import render
from django.http import JsonResponse
from django.views import View
class OrderView(View):
def get(self,request,*args,**kwargs):
ret = {‘code‘: 1000, ‘msg‘: None, ‘error‘: None}
return JsonResponse(ret)
# 这是一个类方法
@classonlymethod
def as_view(cls, **initkwargs):
"""
Main entry point for a request-response process.
"""
for key in initkwargs:
if key in cls.http_method_names:
raise TypeError("You tried to pass in the %s method name as a "
"keyword argument to %s(). Don‘t do that."
% (key, cls.__name__))
if not hasattr(cls, key):
raise TypeError("%s() received an invalid keyword %r. as_view "
"only accepts arguments that are already "
"attributes of the class." % (cls.__name__, key))
def view(request, *args, **kwargs):
# self = OrderView()
self = cls(**initkwargs)
if hasattr(self, ‘get‘) and not hasattr(self, ‘head‘):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
# handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
# return handler(request, *args, **kwargs)
# 这个as_view()返回了一个OrderView().dispatch(request, *args, **kwargs)方法
# 这里返回了dispatch(),所以这个dispath方法会被执行,但是需要从头开始找起
return self.dispatch(request, *args, **kwargs)
view.view_class = cls
view.view_initkwargs = initkwargs
# take name and docstring from class
update_wrapper(view, cls, updated=())
# and possible attributes set by decorators
# like csrf_exempt from dispatch
update_wrapper(view, cls.dispatch, assigned=())
# 由于调用url会views.OrderView.as_view()()所以,这里会执行view函数
return view
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn‘t exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn‘t on the approved list.
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
# 最终返回了执行后的handler()
return handler(request, *args, **kwargs)
文章标题:restframework api(基础3CBV)
文章链接:http://soscw.com/index.php/essay/73502.html