@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
@method_decorator(sensitive_post_parameters())@method_decorator(never_cache)defdispatch(self,*args,**kwargs):assert'uidb64'inkwargsand'token'inkwargsself.validlink=Falseself.user=self.get_user(kwargs['uidb64'])ifself.userisnotNone:token=kwargs['token']iftoken==INTERNAL_RESET_URL_TOKEN:session_token=self.request.session.get(INTERNAL_RESET_SESSION_TOKEN)ifself.token_generator.check_token(self.user,session_token):# If the token is valid, display the password reset form.self.validlink=Truereturnsuper().dispatch(*args,**kwargs)else:ifself.token_generator.check_token(self.user,token):# Store the token in the session and redirect to the# password reset form at a URL without the token. That# avoids the possibility of leaking the token in the# HTTP Referer header.self.request.session[INTERNAL_RESET_SESSION_TOKEN]=tokenredirect_url=self.request.path.replace(token,INTERNAL_RESET_URL_TOKEN)returnHttpResponseRedirect(redirect_url)# Display the "Password reset unsuccessful" page.returnself.render_to_response(self.get_context_data())
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))
PasswordResetConfirmView
If the form is valid, redirect to the supplied URL.
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 form class to use.
25
26
27
defget_form_class(self):"""Return the form class to use."""returnself.form_class
PasswordResetConfirmView
Return the keyword arguments for instantiating the form.
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 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]
284
285
286
287
288
289
290
291
defget_user(self,uidb64):try:# urlsafe_base64_decode() decodes to bytestringuid=urlsafe_base64_decode(uidb64).decode()user=UserModel._default_manager.get(pk=uid)except(TypeError,ValueError,OverflowError,UserModel.DoesNotExist,ValidationError):user=Nonereturnuser
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)