es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Enlace de restablecimiento de contraseña de Django (v3.1): Error de aserción en la línea 260 de django/contrib/auth/views.py. Se requiere que estén presentes ‘uidb64’ y ‘token’ en los argumentos con palabras clave (kwargs).

Estoy teniendo problemas para superar un error de afirmación al hacer clic en el enlace de restablecimiento de contraseña en Django 3.1.2. Tengo Django ejecutándose dentro de un contenedor de Docker.

El enlace enviado por correo electrónico parece correcto, ya que utiliza el dominio adecuado ‘localhost’. Sin embargo, después de hacer clic en el enlace, el mensaje de error reemplaza el dominio ‘localhost’ con ‘Django:8000’.

ARCHIVOS HTML

password_reset_email.html

{% load i18n %}{% autoescape off %}
{% trans "You're receiving this e-mail because you requested a password reset" %}
{% blocktrans %}for your user account at {{ site_name }}{% endblocktrans %}.

<p>{% trans "Please go to the following page and choose a new password:" %}
{% block reset_link %}
{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb36=uid token=token %}
{% endblock %}
{% trans "Your username, in case you've forgotten:" %} {{ user.username }}</p>

<p>{% trans "Thanks for using our site!" %}</p>

<p>{% blocktrans %}The Super Awesome team{% endblocktrans %}</p>

<p>{% endautoescape %}

password_reset_confirm.html

{% extends "admin/base_site.html" %}
{% load i18n %}

{% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans 'Home' %}</a> › {% trans 'Password reset confirmation' %}</div>{% endblock %}

{% block title %}{% trans 'Password reset' %}{% endblock %}

{% block content %}

{% if validlink %}

<h1>{% trans 'Enter new password' %}</h1>

<p>{% trans "Please enter your new password twice so we can verify you typed it in correctly." %}</p>

<form action="" method="post">
{{ form.new_password1.errors }}
<p class="aligned wide"><label for="id_new_password1">{% trans 'New password:' %}</label>{{ form.new_password1 }}</p>
{{ form.new_password2.errors }}
<p class="aligned wide"><label for="id_new_password2">{% trans 'Confirm password:' %}</label>{{ form.new_password2 }}</p>
<p><input type="submit" value="{% trans 'Change my password' %}" /></p>
</p></form>

{% else %}

<h1>{% trans 'Password reset unsuccessful' %}</h1>

<p>{% trans "The password reset link was invalid, possibly because it has already been used.  Please request a new password reset." %}</p>

{% endif %}

{% endblock %}

SCRIPT DE URL:

urls.py

auth_patterns = 
[
    path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),
    re_path(r'^password_reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
]

Traza completa de error:

Environment:

<p>Request Method: GET
Request URL: https://django:8000/accounts/password_reset/mjq5-ax0zta-7bba9cbeb8c411bfd0dcdee5d5ae10a6/</p>

<p>Django Version: 3.1.2
Python Version: 3.8.10
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.messages',
 'django.contrib.sessions',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'django.contrib.sites',
 'formtools',
 'django_extensions',
 'templateutils',
 'countries',
 'pagination',
 'seeker',
 )
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'pagination.middleware.PaginationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'disc.middleware.LowerCaseMiddleware')</p>

<p>Traceback (most recent call last):
  File "/root/.local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/root/.local/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/root/.local/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/root/.local/lib/python3.8/site-packages/django/utils/decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "/root/.local/lib/python3.8/site-packages/django/views/decorators/debug.py", line 89, in sensitive_post_parameters_wrapper
    return view(request, *args, **kwargs)
  File "/root/.local/lib/python3.8/site-packages/django/utils/decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "/root/.local/lib/python3.8/site-packages/django/views/decorators/cache.py", line 44, in wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/root/.local/lib/python3.8/site-packages/django/contrib/auth/views.py", line 260, in dispatch
    assert 'uidb64' in kwargs and 'token' in kwargs

Exception Type: AssertionError at /accounts/password_reset/mjq5-ax0zta-7bba9cbeb8c411bfd0dcdee5d5ae10a6/
Exception Value: 

docker-compose.yml

“`
version: ‘3’

services:
django:
shm_size: 1g
build:
context: .
dockerfile: docker/django.dockerfile
env_file:
– .env
expose:
– “8000”
ports:
– “10080:8000”
volumes:
– ./run/django/data:/opt/data
– ./run/django/settings:/opt/settings
– ./media/:/media
– ./run/django/logs:/opt/logs
– /var/run/docker.sock:/var/run/docker.sock
healthcheck:
test: [“CMD”, “curl”, “-sf”, “localhost:8000”, “-o”, “/dev/null”]
interval: 180s
timeout: 10s
retries: 3

nginx:
build:
context: docker/nginx
dockerfile: nginx.dockerfile
shm_size: 512m
environment:
– SSL_CERTIFICATE=${SSL_CERTIFICATE}
– DEPLOYMENT_DNS=”${DEPLOYMENT_DNS:-localhost}”
ports:
– “${DISC_HTTP_PORT:-80}:80”
– “${DISC_HTTPS_PORT:-443}:443”
volumes:
– “${CREDENTIALS_PATH:-./run/nginx/credentials}:/credentials”
– “${LETSENCRYPT_CONFIG_PATH:-./run/nginx/letsencrypt/config}:/etc/letsencrypt”
– “${LETSENCRYPT_DATA_PATH:-./run/nginx/letsencrypt/data}:/data/letsencrypt”
– ./static:/static
– ./media/:/media
healthcheck:
test: [“CMD”, “curl”, “-sf”, “–header”, “Host: healthcheck.local”, “localhost:80”, “-o”, “/dev/null”]
interval: 180s
timeout: 10s

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que la función de vista está esperando los parámetros ‘uidb64’ y ‘token’ en la URL, pero no están presentes.

    La URL que se proporciona en el correo electrónico parece correcta, pero después de hacer clic en el enlace, el dominio se reemplaza con ‘Django:8000’, lo que sugiere que podría haber un problema con el parámetro ‘dominio’ en el archivo ‘password_reset_email.html’.

    Aquí hay algunos pasos que se pueden tomar para solucionar el problema:

    1. Verificar el formato de la URL en el correo electrónico y asegurarse de que incluya los parámetros ‘uidb64’ y ‘token’.
    2. Verificar que la variable ‘dominio’ en el archivo ‘password_reset_email.html’ esté configurada correctamente. Debe establecerse en ‘localhost’.

    3. Verificar el archivo ‘urls.py’ y asegurarse de que el patrón de URL ‘password_reset_confirm’ incluya los parámetros ‘uidb64’ y ‘token’.

    4. Verificar que el contenedor de Docker se esté ejecutando y sea accesible en ‘localhost:8000’.

    5. Revisar los registros del servidor para ver si hay algún mensaje de error o rastro de pila que pueda proporcionar más información sobre el problema.

    6. Intentar acceder directamente a la página ‘password_reset_confirm’ ingresando la URL manualmente en el navegador para verificar si el problema está en el enlace en el correo electrónico o en la función de vista ‘password_reset_confirm’.

    Siguiendo estos pasos y solucionando el problema, debería ser posible identificar y resolver el error de afirmación al hacer clic en el enlace de restablecimiento de contraseña en Django 3.1.2.

Comments are closed.