首先更新用户密码,然后从URL获取用户名并更新密码。
不确定该代码是否正常工作,因为我无法再次使用旧密码登录,甚至也无法使用更新的密码登录。
views.py:
from django.shortcuts import render, redirect, get_object_or_404
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from django.contrib.auth.models import User
from django.contrib import auth
def change_password2(request, user_username):
var_username = get_object_or_404(User, username=user_username)
#getting username from url
u = User.objects.get(username__exact=var_username)
password = request.POST.get('password_update', False)
u.set_password(password)
b = u.save()
update_session_auth_hash(request, b)
messages.success(request, 'Your password was successfully updated!')
# return redirect('change_password')
return render(request, 'accounts/change_password2.html')
change_password2.html:
<form method="POST" action="/account/password2/">
{% csrf_token %}
<input type="password" name="password_update">
<input type="submit" name="">
</form>
ursl.py
from django.urls import path
from .import views
urlpatterns = [
path('', views.account, name='account'),
path('account/', views.account, name='account'),
path('signup/', views.signup, name='signup'),
path('password2/<slug:user_username>/', views.change_password2, name='change_password2'),
]
尝试使用隐身模式,但由于缓存原因,不确定其结果。
答案 0 :(得分:1)
这里:
u = User.objects.get(username__exact=var_username)
# ...
b = u.save()
update_session_auth_hash(request, b)
Model.save()
返回None
(提示:作为一般规则,在Python中,更改对象的方法通常返回None
),因此您传递了{{1 }}到None
。您要改为:
update_session_auth_hash()
我无法确定这是否是阻止代码正常工作的唯一要点,但这是一个明显的阻碍因素。
现在,正如我所提到的,您的代码是一团糟,并且是巨大的安全漏洞-实际上,它允许任何人将其他人的密码更改为任何密码...您声明这仅是为了练习,但我建议您需要花一些时间阅读u = User.objects.get(username__exact=var_username)
u.set_password(the_new_password_here)
u.save()
update_session_auth_hash(request, u)
的源代码,以了解如何安全地执行此操作。
wrt /混乱的部分:
contrib.auth
等...