django登錄后修改密碼的方法?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家帶來的參考內容,讓我們一起來看看吧!
Django內置的應用非常多,對于修改用戶密碼,我們可以用自帶的方法去修改,也可以通過自己寫對應的方法去修改.這里來分別將兩種方法羅列出來.
一.首先是用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})
感謝各位的閱讀!看完上述內容,你們對django登錄后修改密碼的方法大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。