urls.py
вызовет вызываемый объект, который передается в path(..)
. Здесь .as_view()
, таким образом, вернет вызванную функцию. Вы можете найти исходный код для этого в репозитории GitHub :
@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 = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.setup(request, *args, **kwargs)
if not hasattr(self, 'request'):
raise AttributeError(
"%s instance has no 'request' attribute. Did you override "
"setup() and forget to call super()?" % cls.__name__
)
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
Таким образом, он вернет функцию view
, которую он создает в as_view()
метод. Когда затем вызывается метод view()
, когда вы «запускаете» представление, он создает экземпляр View
с необязательным **initkwargs
, который вы передали методу as_view()
. Таким образом, это означает, что каждый HTTP-запрос будет создавать новый View
объект.
Затем он будет «настраивать» объект путем добавления request
, args
и kwargs
к экземпляру. Наконец, он вызовет self.dispatch(..)
, этот метод рассмотрит метод запроса (GET, POST, PUT, PATCH, DELETE,…), выяснит, является ли он частью допустимых методов, и в этом случае вызовет соответствующий * 1026. *, .post(..)
, `.put (..),… метод и вернуть результат этого метода.