Django视图为_视图()
收到用户的请求时会发生什么情况? 该视图是从类视图返回的吗?Django视图为_视图(),django,Django,收到用户的请求时会发生什么情况? 该视图是从类视图返回的吗? 或者是否创建了类视图的实例?URL.py将调用传递到路径(…)的可调用对象。因此,.as_view()将返回调用的函数。您可以在以下位置找到此的源代码: 因此,它将返回它在as_view()方法中构造的视图函数。当“触发”视图时调用view()方法时,它将使用传递给as\u view()方法的可选**initkwargs构造一个view实例。因此,这意味着每个HTTP请求将构造一个新的视图对象 接下来,它将通过向实例添加请求、参数和k
或者是否创建了类视图的实例?URL.py将调用传递到
路径(…)
的可调用对象。因此,.as_view()
将返回调用的函数。您可以在以下位置找到此的源代码:
因此,它将返回它在as_view()
方法中构造的视图
函数。当“触发”视图时调用view()
方法时,它将使用传递给as\u view()方法的可选**initkwargs
构造一个view
实例。因此,这意味着每个HTTP请求将构造一个新的视图
对象
接下来,它将通过向实例添加请求
、参数
和kwargs
来“设置”obect。最后,它将调用self.dispatch(..)
此方法将查看请求方法(GET、POST、PUT、PATCH、DELETE等),查看它是否是可接受方法的一部分,在这种情况下,将触发相应的.GET(..)
,.POST(..)
,.PUT(..)
,…方法,然后返回该方法的结果。是,。as_view()
返回一个函数。因此它返回一个附加了一些属性的视图函数。@classonlymethod Djangos是否是类方法的自己的装饰器?@StreamlineAstra:是的,它是@classmethod
的子类,如果您错误地使用它,它将引发异常(例如,在调用self.as\u view()
时):对于**initkwargs?@StreamlineAstra,通常传递给as\u view()的是什么?@StreamlineAstra:例如,您可以传递模板\u name
或未在基于类的视图本身中指定的其他类属性,例如,如果您想多次使用该视图,每次都会有一些小的更改。
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)¶
@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