Django просмотров as_view () - PullRequest
2 голосов
/ 07 февраля 2020
Example views.py:
from django.http import HttpResponse
from django.views import View

class MyView(View):

    def get(self, request, *args, **kwargs):
        return HttpResponse('Hello, World!')

Example urls.py:
from django.urls import path
from myapp.views import MyView

urlpatterns = [
    path('mine/', MyView.as_view(), name='my-view'),
]



classmethod as_view(**initkwargs)¶

Что происходит при получении запроса от пользователя? Вызывается ли представление, возвращаемое из ClassView.as_view ()? Или создан экземпляр Class View?

1 Ответ

2 голосов
/ 07 февраля 2020

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 (..),… метод и вернуть результат этого метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...