@classonlymethoddefas_view(cls,**initkwargs):"""Main entry point for a request-response process."""forkeyininitkwargs:ifkeyincls.http_method_names:raiseTypeError('The method name %s is not accepted as a keyword argument ''to %s().'%(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)self.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==self.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,self.reset_url_token)returnHttpResponseRedirect(redirect_url)# Display the "Password reset unsuccessful" page.returnself.render_to_response(self.get_context_data())
View
90
91
92
93
94
95
96
97
98
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.
141
142
143
144
145
146
147
148
149
150
151
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]
286
287
288
289
290
291
292
293
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
100
101
102
103
104
105
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())
Handle responding to requests for the OPTIONS HTTP verb.
107
108
109
110
111
112
defoptions(self,request,*args,**kwargs):"""Handle responding to requests for the OPTIONS HTTP verb."""response=HttpResponse()response.headers['Allow']=', '.join(self._allowed_methods())response.headers['Content-Length']='0'returnresponse
Handle POST requests: instantiate a form instance with the passed
POST variables and then check if it's valid.
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)
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.
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.
82
83
84
85
86
87
88
defsetup(self,request,*args,**kwargs):"""Initialize attributes shared by all view methods."""ifhasattr(self,'get')andnothasattr(self,'head'):self.head=self.getself.request=requestself.args=argsself.kwargs=kwargs
Constructor. Called in the URLconf; can contain helpful extra
keyword arguments, and other things.
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)