django - 用于重置密码链接的 Django 内置身份验证在 url 中截断令牌
问题描述
我正在使用内置的 Django 身份验证来发送电子邮件以重置密码。发送电子邮件有效,但是当我尝试按照页面链接重置密码时,Django 会更改 URL(我猜有点像重定向),然后尝试将 URL 解析为“ http://127.0. 0.1:8000/registration/USER_ID/set-password ',而不是' http://127.0.0.1:8000/registration/USER_ID/TOKEN '。Django 然后抛出一个错误:'NoReverseMatch at /registration/reset/USER_ID/set-password/'
我没有名为“set-password”的文件,并且在我的代码(模板、URLconf)中没有任何地方有“set-password”。
urlpatterns = [
...
...
path('password_reset/', auth_views.PasswordResetView.as_view(),
name='password_reset'),
path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(),
name='password_reset_done'),
path('reset/<uidb64>/<token>/',
auth_views.PasswordResetConfirmView.as_view(),
name='password_reset_confirm'),
path('reset/done', auth_views.PasswordResetCompleteView.as_view(),
name='password_reset_complete'),
]
我正在使用文档(https://docs.djangoproject.com/en/2.1/topics/auth/default/#using-the-views)中的代码进行 URL 匹配,所以我没有创建任何新内容。似乎 Django 正在从 URL 中删除令牌?
解决方案
所以我想出了答案,如果将来其他人有同样的问题。在“password_reset_confirm”模板中,我将表单的操作设置为action="{% url 'password_reset_confirm' %}"
,这导致 Django 在页面最初加载时尝试构建该 URL。因为“password_reset_confirm”有参数,所以我收到了 NoReverseMatch 错误(因为我没有在操作 URL 中提供任何参数)。action
从表单中删除可以解决问题。
推荐阅读
- c# - 在 asp.net core signalR 1.1.0 中找不到集线器参考?
- node.js - 在 ews-javascript-api 或应用程序中处理 ErrorExceededConnectionCount?
- rust - 为什么在调用一个通过值获取 self 的方法时会借用一个移动值,而该方法的参数也调用一个方法?
- node.js - 如何在collector.on('end',...)中获取'原因'
- primes - 现在安装的 C 编译器如何导入数论函数?
- sed - 使用 sed 更改模式仅用于匹配 df 文件中的行
- python - Python Portable + Geany Portable - “程序以代码 0 退出”
- r - 从特定列开始并根据 R 中的条件遍历特定数量的列
- c# - c# do while unassigned局部变量问题
- c# - 如何使用 C# 更新数据库/表并在 GridView 中即时显示更改?