更新密码,但无法从Django中更新的密码登录

时间:2019-02-06 14:56:33

标签: python django

首先更新用户密码,然后从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'),

]

尝试使用隐身模式,但由于缓存原因,不确定其结果。

1 个答案:

答案 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

等...