@classonlymethoddefas_view(cls,**initkwargs):"""Main entry point for a request-response process."""forkeyininitkwargs:ifkeyincls.http_method_names:raiseTypeError("You tried to pass in the %s method name as a ""keyword argument to %s(). Don't do that."%(key,cls.__name__))ifnothasattr(cls,key):raiseTypeError("%s() received an invalid keyword %r. as_view ""only accepts arguments that are already ""attributes of the class."%(cls.__name__,key))defview(request,*args,**kwargs):self=cls(**initkwargs)ifhasattr(self,'get')andnothasattr(self,'head'):self.head=self.getself.setup(request,*args,**kwargs)ifnothasattr(self,'request'):raiseAttributeError("%s instance has no 'request' attribute. Did you override ""setup() and forget to call super()?"%cls.__name__)returnself.dispatch(request,*args,**kwargs)view.view_class=clsview.view_initkwargs=initkwargs# take name and docstring from classupdate_wrapper(view,cls,updated=())# and possible attributes set by decorators# like csrf_exempt from dispatchupdate_wrapper(view,cls.dispatch,assigned=())returnview
LoginView
49
50
51
52
53
54
55
56
57
58
59
60
61
@method_decorator(sensitive_post_parameters())@method_decorator(csrf_protect)@method_decorator(never_cache)defdispatch(self,request,*args,**kwargs):ifself.redirect_authenticated_userandself.request.user.is_authenticated:redirect_to=self.get_success_url()ifredirect_to==self.request.path:raiseValueError("Redirection loop for authenticated user detected. Check that ""your LOGIN_REDIRECT_URL doesn't point to a login page.")returnHttpResponseRedirect(redirect_to)returnsuper().dispatch(request,*args,**kwargs)
View
89
90
91
92
93
94
95
96
97
defdispatch(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.ifrequest.method.lower()inself.http_method_names:handler=getattr(self,request.method.lower(),self.http_method_not_allowed)else:handler=self.http_method_not_allowedreturnhandler(request,*args,**kwargs)
If the form is invalid, render the invalid form.
59
60
61
defform_invalid(self,form):"""If the form is invalid, render the invalid form."""returnself.render_to_response(self.get_context_data(form=form))
LoginView
Security check complete. Log the user in.
88
89
90
91
defform_valid(self,form):"""Security check complete. Log the user in."""auth_login(self.request,form.get_user())returnHttpResponseRedirect(self.get_success_url())
FormMixin
If the form is valid, redirect to the supplied URL.
55
56
57
defform_valid(self,form):"""If the form is valid, redirect to the supplied URL."""returnHttpResponseRedirect(self.get_success_url())
Handle GET requests: instantiate a blank version of the form.
131
132
133
defget(self,request,*args,**kwargs):"""Handle GET requests: instantiate a blank version of the form."""returnself.render_to_response(self.get_context_data())
defget_context_data(self,**kwargs):"""Insert the form into the context dict."""if'form'notinkwargs:kwargs['form']=self.get_form()returnsuper().get_context_data(**kwargs)
Return an instance of the form to be used in this view.
29
30
31
32
33
defget_form(self,form_class=None):"""Return an instance of the form to be used in this view."""ifform_classisNone:form_class=self.get_form_class()returnform_class(**self.get_form_kwargs())
Return the keyword arguments for instantiating the form.
35
36
37
38
39
40
41
42
43
44
45
46
defget_form_kwargs(self):"""Return the keyword arguments for instantiating the form."""kwargs={'initial':self.get_initial(),'prefix':self.get_prefix(),}ifself.request.methodin('POST','PUT'):kwargs.update({'data':self.request.POST,'files':self.request.FILES,})returnkwargs
Return the initial data to use for forms on this view.
17
18
19
defget_initial(self):"""Return the initial data to use for forms on this view."""returnself.initial.copy()
Return the prefix to use for forms.
21
22
23
defget_prefix(self):"""Return the prefix to use for forms."""returnself.prefix
Return the user-originating redirect URL if it's safe.
67
68
69
70
71
72
73
74
75
76
77
78
defget_redirect_url(self):"""Return the user-originating redirect URL if it's safe."""redirect_to=self.request.POST.get(self.redirect_field_name,self.request.GET.get(self.redirect_field_name,''))url_is_safe=is_safe_url(url=redirect_to,allowed_hosts=self.get_success_url_allowed_hosts(),require_https=self.request.is_secure(),)returnredirect_toifurl_is_safeelse''
LoginView
Return the URL to redirect to after processing a valid form.
Return the URL to redirect to after processing a valid form.
49
50
51
52
53
defget_success_url(self):"""Return the URL to redirect to after processing a valid form."""ifnotself.success_url:raiseImproperlyConfigured("No URL to redirect to. Provide a success_url.")returnstr(self.success_url)# success_url may be lazy
Return a list of template names to be used for the request. Must return
a list. May not be called if render_to_response() is overridden.
140
141
142
143
144
145
146
147
148
149
150
defget_template_names(self):""" Return a list of template names to be used for the request. Must return a list. May not be called if render_to_response() is overridden. """ifself.template_nameisNone:raiseImproperlyConfigured("TemplateResponseMixin requires either a definition of ""'template_name' or an implementation of 'get_template_names()'")else:return[self.template_name]
99
100
101
102
103
104
defhttp_method_not_allowed(self,request,*args,**kwargs):logger.warning('Method Not Allowed (%s): %s',request.method,request.path,extra={'status_code':405,'request':request})returnHttpResponseNotAllowed(self._allowed_methods())
Обрабатывает ответы на запросы для запроса HTTP OPTIONS.
106
107
108
109
110
111
defoptions(self,request,*args,**kwargs):"""Handle responding to requests for the OPTIONS HTTP verb."""response=HttpResponse()response['Allow']=', '.join(self._allowed_methods())response['Content-Length']='0'returnresponse
Обработчик POST-запросов. Создает экземпляр формы из переданных POST переменных и проверяет их.
135
136
137
138
139
140
141
142
143
144
defpost(self,request,*args,**kwargs):""" Handle POST requests: instantiate a form instance with the passed POST variables and then check if it's valid. """form=self.get_form()ifform.is_valid():returnself.form_valid(form)else:returnself.form_invalid(form)
Возвращает ответ (response), используя `response_class` для этого представления, с шаблоном, отображаемым с заданным контекстом.
Передает response_kwargs в конструктор класса ответа.
defrender_to_response(self,context,**response_kwargs):""" Return a response, using the `response_class` for this view, with a template rendered with the given context. Pass response_kwargs to the constructor of the response class. """response_kwargs.setdefault('content_type',self.content_type)returnself.response_class(request=self.request,template=self.get_template_names(),context=context,using=self.template_engine,**response_kwargs)
Initialize attributes shared by all view methods.
83
84
85
86
87
defsetup(self,request,*args,**kwargs):"""Initialize attributes shared by all view methods."""self.request=requestself.args=argsself.kwargs=kwargs
Конструктор. Вызывается в URLconf; может содержать полезные дополнительные ключевые аргументы и другие вещи.
38
39
40
41
42
43
44
45
46
def__init__(self,**kwargs):""" Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things. """# Go through keyword arguments, and either save their values to our# instance, or raise an error.forkey,valueinkwargs.items():setattr(self,key,value)