【问题标题】:Recover GET parameter from PasswordResetConfirmView从 PasswordResetConfirmView 恢复 GET 参数
【发布时间】:2018-01-28 10:50:37
【问题描述】:

我正在尝试从 Django 模板视图 django.contrib.auth.PasswordResetConfirmView 中恢复 GET 参数。 基本上,当用户点击他的密码重置链接(如http://127.0.0.1:8000/commons/reset/MQ/4t8-210d1909d621e8b4c68e/?origin_page=/mypage/)时,我希望能够检索origin_page=/mypage/ 参数。到目前为止,我的url.py 看起来像这样:

from django.urls import path
from . import views

app_name = 'commons'
urlpatterns = [
    path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
]

我的views.py 是这样的:

from django.contrib.auth import views as auth_views

class PasswordResetConfirmView(auth_views.PasswordResetConfirmView):
    template_name = 'commons/password_reset_confirm.html'
    success_url = '/commons/reset/done/'

    def get(self, request, *args, **kwargs):
        self.extra_context = {
            'origin_page': request.GET.get('origin_page')
        }
        return super().get(request, *args, **kwargs)

如您所见,我正在尝试使用'origin_page': request.GET.get('origin_page') 获取我的origin_page,但它不起作用,我得到了None 值。我什至使用调试器检查类/方法中的每个对象,但它们似乎都不包含我的 origin_page 变量。 有什么想法吗?

【问题讨论】:

  • 不完全一样,我相应地修改了我的代码
  • 另外,小心使用来自用户的不受信任的origin_page。如果您查看 Django 管理应用程序,它会在重定向之前检查 next 值。
  • @Alasdair 抱歉,我编辑了我的帖子,我忘记更改了。事实上,我得到了一个None 值而不是一个键错误。所以我不应该在我的密码重置网址中添加origin_page 参数吗?那为什么是最好的方法呢?我需要知道用户从哪个网页发送了他的密码重置。
  • 如果你转到http://127.0.0.1:8000/commons/reset/MQ/4t8-210d1909d621e8b4c68e/?origin_page=/mypage/,那么request.GET.get('origin_page') 应该是'/mypage/'。很难进一步调试,因为代码应该可以工作。

标签: python django django-2.0


【解决方案1】:

PasswordResetConfirmView 执行内部重定向,从 URL 中删除令牌。因此,您通过电子邮件传递的任何查询参数也会被删除。执行此操作的代码行在 PasswordResetConfirmViewdispatch 函数中,它将路径替换为常量: https://github.com/django/django/blob/master/django/contrib/auth/views.py#L280

redirect_url = self.request.path.replace(token, self.reset_url_token)

所以你有正确的想法,你需要子类化 PasswordResetConfirmView 但我相信你需要改变 dispatch 函数,其中函数基本相同,除了将原始查询参数添加回 @987654328 @:

# tack on whatever query params came with the email link
redirect_url = f'{redirect_url}?{self.request.GET.urlencode()}'

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    相关资源
    最近更新 更多