摘要:最常見的用法就是存儲用戶的登錄數(shù)據(jù)。如果用戶未登錄,則顯示登錄兩個字提醒用戶可以點擊登錄。創(chuàng)建文件用戶登錄配置根路由用戶管理配置因為這個并沒有改動,因此不用遷移數(shù)據(jù)。總結本章用到了表單類模板語句用戶驗證等知識完成了用戶管理的登錄和退出。
用戶管理
用戶數(shù)據(jù)可以說是大部分網(wǎng)站最重要的資產(chǎn)。用戶管理就是對用戶數(shù)據(jù)進行增刪改查等操作的功能,自然也就非常的重要了。
本章開始學習用戶管理的內容,首先從用戶登錄開始。
在Django中用app來區(qū)別不同功能的模塊,達到代碼隔離和復用。因為用戶管理和博客文章的功能不同,因此需要新建一個專門的app。
進入虛擬環(huán)境,運行startapp指令創(chuàng)建新的app:
python manage.py startapp userprofile
查看項目目錄,發(fā)現(xiàn)已經(jīng)新生成了userprofile目錄及其中的文件了。
再遇表單類用戶登錄時,需要填寫賬戶密碼等表單數(shù)據(jù),因此又要用到Form表單類。
在userprofile目錄中創(chuàng)建表單類的文件forms.py,編寫如下代碼:
/userprofile/forms.py # 引入表單類 from django import forms # 引入 User 模型 from django.contrib.auth.models import User # 登錄表單,繼承了 forms.Form 類 class UserLoginForm(forms.Form): username = forms.CharField() password = forms.CharField()
在前面發(fā)表文章的模塊中,表單類繼承了forms.ModelForm,這個父類適合于需要直接與數(shù)據(jù)庫交互的功能,比如新建、更新數(shù)據(jù)庫的字段等。如果表單將用于直接添加或編輯Django模型,則可以使用 ModelForm來避免重復書寫字段描述。
而forms.Form則需要手動配置每個字段,它適用于不與數(shù)據(jù)庫進行直接交互的功能。用戶登錄不需要對數(shù)據(jù)庫進行任何改動,因此直接繼承forms.Form就可以了。
編寫視圖用戶的登錄是比較復雜的功能,好在Django提供了封裝好的模塊供我們使用。
首先在userprofile/views.py中寫視圖函數(shù):
/userprofile/views.py from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login from django.http import HttpResponse from .forms import UserLoginForm # Create your views here. def user_login(request): if request.method == "POST": user_login_form = UserLoginForm(data=request.POST) if user_login_form.is_valid(): # .cleaned_data 清洗出合法數(shù)據(jù) data = user_login_form.cleaned_data # 檢驗賬號、密碼是否正確匹配數(shù)據(jù)庫中的某個用戶 # 如果均匹配則返回這個 user 對象 user = authenticate(username=data["username"], password=data["password"]) if user: # 將用戶數(shù)據(jù)保存在 session 中,即實現(xiàn)了登錄動作 login(request, user) return redirect("article:article_list") else: return HttpResponse("賬號或密碼輸入有誤。請重新輸入~") else: return HttpResponse("賬號或密碼輸入不合法") elif request.method == "GET": user_login_form = UserLoginForm() context = { "form": user_login_form } return render(request, "userprofile/login.html", context) else: return HttpResponse("請使用GET或POST請求數(shù)據(jù)")
跟發(fā)表文章的表單類類似,F(xiàn)orm對象的主要任務就是驗證數(shù)據(jù)。調用is_valid()方法驗證并返回指定數(shù)據(jù)是否有效的布爾值。
Form不僅負責驗證數(shù)據(jù),還可以“清洗”它:將其標準化為一致的格式,這個特性使得它允許以各種方式輸入特定字段的數(shù)據(jù),并且始終產(chǎn)生一致的輸出。一旦Form使用數(shù)據(jù)創(chuàng)建了一個實例并對其進行了驗證,就可以通過cleaned_data屬性訪問清洗之后的數(shù)據(jù)。
authenticate()方法驗證用戶名稱和密碼是否匹配,如果是,則將這個用戶數(shù)據(jù)返回。
login()方法實現(xiàn)用戶登錄,將用戶數(shù)據(jù)保存在session中。
其他的內容就跟發(fā)表文章時的技巧類似了。
什么是sessionSession在網(wǎng)絡應用中,稱為“會話控制”,它存儲特定用戶會話所需的屬性及配置信息。
當用戶在 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。
Session 最常見的用法就是存儲用戶的登錄數(shù)據(jù)。
詳情看這里:Session百度百科
登錄的模板接著寫模板文件。
創(chuàng)建/templates/userprofile/login.html模板:
/templates/userprofile/login.html {% extends "base.html" %} {% load staticfiles %} {% block title %} 登錄 {% endblock title %} {% block content %}{% endblock content %}
內容與使用Form表單類發(fā)表新文章非常類似。唯一新知識是輸入密碼表單的type="password",可以讓輸入密碼的時候顯示小圓點,避免有人偷窺。
然后我們改寫一下tempalates/header.html,把登錄的按鈕加進去:
/tempalates/header.html ......
這里使用了新的模板語法:{% if ... %},用來判斷用戶是否已經(jīng)登錄:
如果用戶已經(jīng)登錄,則顯示一個名字為用戶名稱的下拉框,就像通常的社交網(wǎng)站一樣。
如果用戶未登錄,則顯示“登錄”兩個字提醒用戶可以點擊登錄。
is_authenticated是models.User類的屬性,用于判斷用戶是否已通過身份驗證。
url及其他設置最后的步驟就是將app配置到項目中去。
創(chuàng)建userprofile/urls.py文件:
/userprofile/urls.py from django.urls import path from . import views app_name = "userprofile" urlpatterns = [ # 用戶登錄 path("login/", views.user_login, name="login"), ]
配置根路由my_blog/urls.py:
/my_blog/urls.py ... urlpatterns = [ ... # 用戶管理 path("userprofile/", include("userprofile.urls", namespace="userprofile")), ]
配置my_blog/settings.py:
my_blog/settings.py ... INSTALLED_APPS = [ ... "userprofile", ] ...
因為userprofile這個app并沒有改動model,因此不用遷移數(shù)據(jù)。
OK了,運行服務器,在admin后臺中退出登錄(找找頁面右上角),返回到文章列表頁:
點擊登錄按鈕,輸入賬號和密碼(可以故意輸錯試試會出現(xiàn)什么):
點擊提交,將自動回到文章列表頁面:
大功告成。
用戶的退出有了用戶登錄的知識后,用戶退出就很簡單了。這里就直接給出代碼,相信你一定能看懂。
還是先添加用戶退出的視圖:
/userprofile/views.py ... # 引入logout模塊 from django.contrib.auth import authenticate, login, logout ... # 用戶退出 def user_logout(request): logout(request) return redirect("article:article_list")
然后配置/userprofile/urls.py:
/userprofile/urls.py ... urlpatterns = [ path("login/", views.user_login, name="login"), # 用戶退出 path("logout/", views.user_logout, name="logout"), ]
在寫登錄的代碼時,已經(jīng)給用戶退出留好了接口,因此只需要改動/templates/header.html:
/templates/header.html ... # 改動 href 中的鏈接指向 退出登錄 ...
保存后刷新頁面,點擊下拉框中“退出登錄”選項,用戶就順利退出了。
總結本章用到了表單類、if模板語句、用戶驗證等知識完成了用戶管理的登錄和退出。
接下來學習如何實現(xiàn)注冊和刪除。
有疑問請在杜賽的個人網(wǎng)站留言,我會盡快回復。
或Email私信我:[email protected]
項目完整代碼:Django_blog_tutorial
轉載請告知作者并注明出處。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/44922.html
摘要:既然有登錄登出,那么用戶的注冊肯定也是少不了的。用戶在注冊成功后會自動登錄并返回博客列表頁面??偨Y本章用到了表單類對數(shù)據(jù)進行驗證清洗等知識,完成了用戶的注冊功能。 既然有登錄登出,那么用戶的注冊肯定也是少不了的。 注冊表單類 用戶注冊時會用到表單來提交賬號、密碼等數(shù)據(jù),所以需要寫注冊用的表單/userprofile/forms.py: /userprofile/forms.py .....
摘要:本章講如何幫助健忘癥患者,重置用戶密碼。實際上不僅內置了密碼重置,還包括登錄登出密碼修改等功能??偨Y本章學習了使用第三方庫,高效完成了重置密碼的功能。有疑問請在杜賽的個人網(wǎng)站留言,我會盡快回復。 隨著技術的發(fā)展,驗證用戶身份的手段越來越多,指紋、面容、聲紋應有盡有,但密碼依然是最重要的手段。 互聯(lián)網(wǎng)處處都有密碼的身影,甚至變成了現(xiàn)代人的一種負擔。像筆者這樣的,動輒幾十個賬號密碼,忘記其...
摘要:聲明本博客的注冊登錄退出功能將使用,參考資源如下文檔教程安裝配置信息安裝后設置,將相關加入到里去。指定與特定配置文件相關聯(lián)的對象之數(shù)據(jù)庫的。因此并沒有提供用戶詳情應用用戶詳情請參考個人博客五用戶個人資料擴展 聲明:本博客的注冊登錄退出功能將使用django-allauth,參考資源如下:django-allauth文檔django-allauth教程 1、安裝django-allau...
摘要:聲明本博客的注冊登錄退出功能將使用,參考資源如下文檔教程安裝配置信息安裝后設置,將相關加入到里去。指定與特定配置文件相關聯(lián)的對象之數(shù)據(jù)庫的。因此并沒有提供用戶詳情應用用戶詳情請參考個人博客五用戶個人資料擴展 聲明:本博客的注冊登錄退出功能將使用django-allauth,參考資源如下:django-allauth文檔django-allauth教程 1、安裝django-allau...
閱讀 2066·2021-11-22 13:52
閱讀 991·2021-11-17 09:33
閱讀 2719·2021-09-01 10:49
閱讀 2853·2019-08-30 15:53
閱讀 2665·2019-08-29 16:10
閱讀 2438·2019-08-29 11:31
閱讀 1364·2019-08-26 11:40
閱讀 1877·2019-08-26 10:59