Django内置的应用非常多,对于修改用户密码,我们可以用自带的方法去修改,也可以通过自己写对应的方法去修改.这里来分别将两种方法罗列出来.
相关的源码被保存在django.contrib.auth的views中.同样的,django自带的login和logout函数也在这里.其中有一个定义的password_change方法和password_change_done方法,一个是我们修改密码的方法,一个是我们修改完成后处理的方法.
由于django已经给我们写好了,我们不需要在views中再配置,直接定义urls.如下:
from django.contrib.auth import views as auth_views
urlpatterns = [
url(r'password-change/$', auth_views.password_change, {
'template_name': "account/password_change_form.html",
'post_change_redirect': '/account/password-change-done'}, name='password_change'),
url(r'password-change-done/$', auth_views.password_change_done, {
'template_name': "account/password_change_done.html"}, name='password_change_done'),
]
因为自带的password_change的模板对应于registration/password_change_form.html,我们在settings里已经讲templates路径改为自己设置的路径,所以这里我们直接将自己写好的模板通过参数形式传入.通过看源码可只如果我们没有给定跳转路径,则会自动跳转到password_change_done,但是我们写的password_change_done是保存在自己创建的用户管理app里,路径前面多了个account,因此,我们需要自己将这个跳转路径传入.
同理,password_change_done也是一样的,只不过它的模板引用名称为password_change_done.html
刚学的小白要注意,不能直接从前段表单里获取密码的输入值,然后与数据库中存放的值做比较.因为数据库中的密码是经过算法加密后的哈希值,是密文,无法直接做比较.通过学习django官方文档可以知道,django自带的有关密码的验证函数.
在django.contrib.auth.hashers模块提供一组函数来创建和验证散列密码,比较好的是可以独立于User模型来使用,也就是说我们不必绑定用户对象,可以直接拿来使用.其中有三个函数,方法及介绍如下:
check_password(password, encoded)
如果要通过将纯文本密码与数据库中的散列密码进行比较来手动验证用户,请使用方便功能 check_password()。它需要两个参数:要检查的纯文本密码,以及数据库中要检查的用户 password 字段的完整值,如果它们匹配,则返回 True,否则返回 False。
make_password(password, salt=None, hasher='default')
以此应用程序使用的格式创建散列密码。它需要一个强制参数:明文密码。或者,如果您不想使用默认值(PASSWORD_HASHERS 设置的第一个条目),您可以提供盐和散列算法来使用。有关每个哈希算法的算法名称,请参见 包括哈希。如果密码参数是 None,则返回不可用的密码(check_password() 不会接受的密码)。
is_password_usable(encoded_password)
检查给定的字符串是否是具有针对 check_password() 验证的机会的哈希密码。
这里我们可以用到check_password,以及make_password,介绍的很清楚了.我将我简单的代码放下:
def change_pwd(request):
if request.method == 'POST':
form = ChangepwdForm(request.POST)
if form.is_valid():
user = User.objects.get(username=request.POST.get('username'))
if user:
if check_password(request.POST.get('password'), user.password):
user.password = make_password(request.POST.get('new_password'))
user.save()
return ...
return ...
return ...
else:
return ...
form = ChangepwdForm()
return render(request, 'account/changepwd.html', {'form': form})
最后urls别忘了配置.