Django用戶認證系統使用總結
by:授客 QQ:1033553122
測驗環境
Win7
Django 1.11
使用Django認證系統
本文按默認配置講解Django認證系統的用法,如果默認的認證無法滿足專案,Django提供了對認證系統的擴展與定制,
Django身份驗證同時提供身份驗證和授權,通常稱為身份驗證系統,因為這些特性有些耦合,
用戶物件
默認user物件主要屬性:
- username
- password
- first_name
- last_name
創建用戶物件
>>>fromdjango.contrib.auth.modelsimportUser
>>>user=User.objects.create_user('john', '[email protected]', 'johnpassword')
#如上,此時用戶物件已經被保存到資料庫了,可以對它的屬性進行修改
>>>user.last_name='Lennon'
>>>user.save()
如果已經安裝了Django admin應用,可以直接創建用戶
創建超級用戶
使用createsuperuser 命令:
$ python manage.py createsuperuser --username=joe [email protected]
回車后,會提示輸入密碼,輸入密碼后回車,立即創建用戶,如果命令列省略了--username 或--email 選項,則回車后還會提示輸入這些選項的值,
修改密碼
Django采用hash演算法存盤用戶密碼(參考documentation of how passwords are managed)
通過命令列修改用戶密碼:
manage.py?changepassword?user_name
如果不提供user_name,則默認修改當前系統用戶的密碼.
通過api修改用戶密碼
>>>fromdjango.contrib.auth.modelsimportUser
>>>u=User.objects.get(username='john')
>>>u.set_password('new password')
>>>u.save()
注:這里new password為明文
如果已經安裝了Django admin應用,也可以在認證系統管理頁面修改用戶密碼
修改密碼,將注銷對應用戶的所有會話,
用戶認證
authenticate(request=None, **credentials)
使用authenticate()來確認一系列認證,函式攜帶了credentials關鍵詞引數,默認情況為username和password,如果認證通過,則回傳對應的User物件,否則回傳None:
fromdjango.contrib.authimportauthenticate
user=authenticate(username='john', password='secret')
ifuserisnotNone:
# A backend authenticated the credentials
else:
# No backend authenticated the credentials
除username,password引數之外,我們還可以添加其它條件:
例子,驗證用戶賬號密碼是否正確,同時要求被驗證用戶未被洗掉(is_delete=1),也就是說,驗證用戶賬號密碼前獲取的用戶資料時,自動已經被洗掉的用戶
user=authenticate(username='john', password='secret',is_delete=1)
當然,除了是否洗掉,是否禁用等欄位,其它欄位一般不推薦這么做,可以在驗證用戶賬號密碼前進行其它前置條件的驗證
注意:默認的,django會優先驗證我們顯示提供的引數,最后再驗證is_active是否未1,如果為1,則回傳None
權限和認證(Permissions and Authorization)
略
Web請求中的認證
Django為每個請求提供了 request.user屬性,該屬性代表當前用戶,如果當前用戶未登錄,則該屬性值將被設定為一個匿名用戶AnonymousUser,否則將設定為User的一個實體,
ifrequest.user.is_authenticated:# 已登錄
# Do something for authenticated users.
...
else:# 未登錄
# Do something for anonymous users.
...
登錄
login(request, user, backend=None)[source]
login函式會保存用戶id到session.
注意:用戶登錄后,會話中依舊保留登錄前的的任何匿名會話資料,
fromdjango.contrib.authimportauthenticate, login
defmy_view(request):
username=request.POST['username']
password=request.POST['password']
# 驗證用戶名和密碼,回傳用戶物件
user=authenticate(request, username=username, password=password)
ifuserisnotNone:
login(request, user)
# do something 比如重定向到一個成功頁面.
...
else:
# do something,比如回傳一個登錄錯誤訊息
...
選擇認證后端(backend)
略.
退出
logout(request)
例子:
fromdjango.contrib.authimportlogout
deflogout_view(request):
logout(request)
# do something 比如重定向到一個成功頁面.
注意:如果用戶未登錄,執行logout函式并不會拋出任何例外,
呼叫logout函式,會清空當前請求的所有會話資料,移除所有已存在資料,
對登錄用戶的訪問限制
原始方式
簡單,原始的方式就是檢查request.user.is_authenticated判斷是否認證:
fromdjango.confimportsettings
fromdjango.shortcutsimportredirect
defmy_view(request):
ifnotrequest.user.is_authenticated:
returnredirect('%s?next=%s'% (settings.LOGIN_URL, request.path))
# ...
或者:
fromdjango.shortcutsimportrender
defmy_view(request):
ifnotrequest.user.is_authenticated:
returnrender(request, 'myapp/login_error.html')
# ...
login_required裝飾器
login_required(redirect_field_name='next', login_url=None)
作為快捷方式,可以使用login_required():
fromdjango.contrib.auth.decoratorsimportlogin_required
@login_required
defmy_view(request):
...
login_required() 做以下事情:
- 如果用戶未登錄,重定向到settings.LOGIN_URL變數指定的url,并把當前請求的絕對URL賦值給查詢字串,例: /accounts/login/?next=/polls/3/.
- 如果用戶已登錄,正常執行視圖,
默認的,查詢字串引數名稱為“next”,如果想用其它名稱,需要使用loging_required的可選引數redirect_field_name,舉例如下
fromdjango.contrib.auth.decoratorsimportlogin_required
@login_required(redirect_field_name='my_redirect_field')
defmy_view(request):
...
對應的,html模板中也要使用對應引數名稱,
login_required()還攜帶了可選引數 login_url,例:
fromdjango.contrib.auth.decoratorsimportlogin_required
@login_required(login_url='/accounts/login/')
defmy_view(request):
...
注意,如果不指定login_url引數,則需要配置settings.LOGIN_URL.
更多詳情,參考官方檔案,
一些常見的裝飾器
@require_POST # 設定視圖的http訪問方法必須為POST
@require_GET # 設定視圖的http訪問方法必須為GET
例子:設定視圖的訪問方法必須為POST
from django.views.decorators.http import require_POST,require_GET
@require_POST
def test_page(request):
return render(request, 'website/pages/mytest.html',{})
訪問效果
The LoginRequired mixin
略
Limiting access to logged-in users that pass a test
略
The permission_required decorator
The PermissionRequiredMixin mixin
略
Redirecting unauthorized requests in class-based views
略
Session invalidation on password change
略
Authentication Views
略
Using the views
略
All authentication views
略
Helper functions
略
Built-in forms
略
模板中的認證資料
當使用RequestContext,并且開啟了'django.contrib.auth.context_processors.auth'背景關系處理器時(可在settings.py中配置),當前已登錄用戶和他們的權限都被存盤為變數,存放在模板背景關系中,
Users
例子:
{%ifuser.is_authenticated%}
<p>Welcome, {{user.username}}. Thanks for logging in.</p>{%else%}
<p>Welcome, new user. Please log in.</p>{%endif%}
如果未使用RequestContext,則模板變數不可獲取,比如上述的 {{ user }}
Permissions
略
Managing users in the admin
略
參考鏈接
https://docs.djangoproject.com/en/2.1/topics/auth/
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/92595.html
標籤:Python
上一篇:Django 跨域訪問POST請求需預先發送option請求問題處理方案
下一篇:四則運算
