django의 asview 방법 원본 코드 실현 분석
17379 단어 Django
django의 클래스 보기 보유
지정한 방법을 자동으로 찾는 기능, 원본 코드는
as_view()
방법이 실현되었다.urls.py
from meduo_mall.demo import views
urlpatterns = [
url(r'register/$', views.Demo.as_view())
]
views.py
from django.views.generic import View
class Demo(View):
def get(self, request):
return HttpResponse('get page')
def post(self, request):
return HttpResponse('post page')
왜
as_view
자동으로 지정한 방법과 일치할 수 있는지 먼저 원본 코드를 보십시오:@classonlymethod
def as_view(cls, **initkwargs): # view
"""
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): # : , dispatch
self = cls(**initkwargs) # cls , cls (Demo)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request # request, args, kwargs
self.args = args
self.kwargs = kwargs
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=())
return view
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
if request.method.lower() in self.http_method_names: # , http_method_names=['get', 'post']
handler = getattr(self, request.method.lower(), self.http_method_not_allowed) #
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) #
간략판
@classonlymethod
def as_view(cls, **initkwargs): # view
"""
Main entry point for a request-response process.
"""
def view(request, *args, **kwargs): # : , dispatch
self = cls(**initkwargs) # cls , cls (Demo)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request # request, args, kwargs
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs) # ,
return view
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
if request.method.lower() in self.http_method_names: # , http_method_names=['get', 'post']
handler = getattr(self, request.method.lower(), self.http_method_not_allowed) #
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) #
더욱 간소화한다
def as_view(): # + view
#
...
def view(): #
# request, args, kwargs
...
return dispatch() #
return view
def dispatch(): # ,
...
return handler()
호출 순서:asview --> view --> dispatch
as_view
는 사실상 클로즈업이고 그의 역할은 검사 작업을 한 다음에 되돌아오는 view
방법이다.view
방법으로 처리하는 것이다.dispatch
방법은 지정한 요청 방법을 찾아서 실행합니다.실질적으로 검색을 실현하는 방법dispatch
방법이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.