2016-05-27 8 views
0

Ich benutze contrib auth reset_password in django und bekomme einen Fehler, wenn ich auf den Link klicke, den es mir sendet.Contrib Auth Passwort zurücksetzen Fehler

[27/May/2016 20:23:41] ERROR [django.request:256] Internal Server Error: /reset/MQ/4c9-5eacbebedfa0c1742a1c/ 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 164, in get_response 
    response = response.render() 
    File "/usr/local/lib/python2.7/dist-packages/django/template/response.py", line 158, in render 
    self.content = self.rendered_content 
    File "/usr/local/lib/python2.7/dist-packages/django/template/response.py", line 135, in rendered_content 
    content = template.render(context, self._request) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/backends/django.py", line 74, in render 
    return self.template.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 209, in render 
    return self._render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 201, in _render 
    return self.nodelist.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 903, in render 
    bit = self.render_node(node, context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 917, in render_node 
    return node.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py", line 135, in render 
    return compiled_parent._render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 201, in _render 
    return self.nodelist.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 903, in render 
    bit = self.render_node(node, context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 917, in render_node 
    return node.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.py", line 65, in render 
    result = block.nodelist.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 903, in render 
    bit = self.render_node(node, context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 917, in render_node 
    return node.render(context) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py", line 507, in render 
    six.reraise(*exc_info) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py", line 493, in render 
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 579, in reverse 
    return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 496, in _reverse_with_prefix 
    (lookup_view_s, args, kwargs, len(patterns), patterns)) 
NoReverseMatch: Reverse for 'password-reset-confirm' with arguments '()' and keyword arguments '{u'uidb64': '', u'token': ''}' not found. 1 pattern(s) tried: ['reset/(?P<uidb64>[0-9A-Za-z_\\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$'] 

Hier ist meine urls.py:

url(r'^password_reset/$', views.reset, name='password-reset'), 
url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', 
    views.reset_confirm, name='password-reset-confirm'), 

und meine views.py:

def reset_confirm(request, uidb64=None, token=None): 
    return password_reset_confirm(request, template_name='registration/reset_confirm.html', 
     uidb64=uidb64, token=token, post_reset_redirect=reverse('dashboard-login')) 


def reset(request): 
    return password_reset(request, template_name='registration/reset.html', 
     email_template_name='registration/reset_email.html', 
     subject_template_name='registration/reset_subject.txt', 
     post_reset_redirect=reverse('dashboard-login')) 

und die E-Mail-Vorlage:

Someone asked for password reset for email {{ email }}. Follow the link below: 
https://www.websitename.com{% url 'password-reset-confirm' uidb64=uid token=token %} 

ja, es isn‘ t "websitename.com" in der eigentlichen Vorlage. und meine Reset Seitenvorlagen:

<div class="reset-page"> 
     <h3 class="reset-header">{% blocktrans %}Reset Password - Step 1 of 2{% endblocktrans %}</h3> 
     <form class="login-form" action="{% url 'password-reset' %}" method="post"> 
      <div class='form'>     
       {% csrf_token %}    
       <input id="id_email" name="email" type="text" class="text-login" placeholder="Email" /> 
       <input type="submit" class="submit-login" style="margin-top: 30px;" value="{% trans 'Submit' %}" /> 
      </div> 
     </form> 
     <p class="reset-info">{% blocktrans %}Enter your email address to receive a password change link.{% endblocktrans %}</p> 
</div> 

und die Vorlage, die nicht angezeigt wird, das bestätigt:

<div class="reset-page"> 
     <h3 class="reset-header">{% blocktrans %}Reset Password - Step 2 of 2{% endblocktrans %}</h3> 
     <form class="login-form" action="{% url 'password-reset-confirm' uidb64=uidb64 token=token %}" method="post"> 
      <div class='form'> 
       {% if validlink %} 
        {% csrf_token %} 
        <input id="id_new_password1" name="new_password1" type="text" class="text-login" placeholder="Password" /> 
        <input id="id_new_password2" name="new_password2" type="text" class="text-login" placeholder="Confirm Password" /> 
        <input type="submit" class="submit-login" value="{% trans 'Submit' %}" /> 
       {% else %} 
        <p class="reset-error">{% blocktrans %}Error: This reset link is no longer valid!{% endblocktrans %}</p> 
       {% endif %} 
       {% if error_messages %} 
        <p class="reset-error">Error: {{ error_messages }}</p> 
       {% endif %}      
      </div> 
     </form> 
     <p class="reset-info">{% blocktrans %}Enter your new password, twice.{% endblocktrans %}</p> 
</div> 

Es funktioniert bis zu dem Link E-Mail. Ich gebe meine E-Mail-Adresse unter/password_reset/ein und es sendet die E-Mail, aber der Link gibt mir diesen Fehler, anstatt mich auf die Seite zu bringen, auf der ich 2 neue Passwörter eingegeben habe. Der Fehler scheint in dem URL-Tag in der Bestätigungsvorlage aufzutreten.

EDIT:

Hier ist django.contrib.auth.views.password_reset_confirm(), die aus einem Teil, wo der Fehler kommt, ist:

@sensitive_post_parameters() 
@never_cache 
def password_reset_confirm(request, uidb64=None, token=None, 
          template_name='registration/password_reset_confirm.html', 
          token_generator=default_token_generator, 
          set_password_form=SetPasswordForm, 
          post_reset_redirect=None, 
          current_app=None, extra_context=None): 
    """ 
    View that checks the hash in a password reset link and presents a 
    form for entering a new password. 
    """ 
    UserModel = get_user_model() 
    assert uidb64 is not None and token is not None # checked by URLconf 
    if post_reset_redirect is None: 
     post_reset_redirect = reverse('password_reset_complete') 
    else: 
     post_reset_redirect = resolve_url(post_reset_redirect) 
    try: 
     # urlsafe_base64_decode() decodes to bytestring on Python 3 
     uid = force_text(urlsafe_base64_decode(uidb64)) 
     user = UserModel._default_manager.get(pk=uid) 
    except (TypeError, ValueError, OverflowError, UserModel.DoesNotExist): 
     user = None 

    if user is not None and token_generator.check_token(user, token): 
     validlink = True 
     title = _('Enter new password') 
     if request.method == 'POST': 
      form = set_password_form(user, request.POST) 
      if form.is_valid(): 
       form.save() 
       return HttpResponseRedirect(post_reset_redirect) 
     else: 
      form = set_password_form(user) 
    else: 
     validlink = False 
     form = None 
     title = _('Password reset unsuccessful') 
    context = { 
     'form': form, 
     'title': title, 
     'validlink': validlink, 
    } 
    if extra_context is not None: 
     context.update(extra_context) 

    if current_app is not None: 
     request.current_app = current_app 

    return TemplateResponse(request, template_name, context) 

ich, dass es wasn in der Bestätigungsvorlage realisiert‘ t erhält die Argumente uidb64 und token. Also habe ich sie hinzugefügt, aber jetzt bekomme ich den Fehler oben, was etwas anders ist. Die Argumente scheinen leer zu sein. Wie kann ich die Werte von UIDB64 und Token bekommen, damit ich sie in die URL weitergeben kann?

+0

Bitte zeigen Sie auch, wie die E-Mail-Vorlage gerendert wird. – e4c5

+0

Mit contrib.auth.views password_reset und password_reset_confirm und contrib.auth.forms – shenk

+0

Sorry, ich wusste nicht, dass dort das Rendering gemacht wurde. Vielleicht ist dieser Code nicht wirklich notwendig, aber ein vollständiger Stacktrack wäre definitiv nützlich. – e4c5

Antwort

0

Die Lösung wurde Formularaktion in der confirm Vorlage

action="" 

seltsam genug einzustellen.

Verwandte Themen