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
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:
Verificar que la variable ‘dominio’ en el archivo ‘password_reset_email.html’ esté configurada correctamente. Debe establecerse en ‘localhost’.
Verificar el archivo ‘urls.py’ y asegurarse de que el patrón de URL ‘password_reset_confirm’ incluya los parámetros ‘uidb64’ y ‘token’.
Verificar que el contenedor de Docker se esté ejecutando y sea accesible en ‘localhost:8000’.
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.
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.