簡介
在使用django框架架構(gòu)微信搶票系統(tǒng)時(shí),助教要求我們使用django自帶的用戶驗(yàn)證系統(tǒng)對管理員進(jìn)行管理操作痢法。因?yàn)橹皼]有用過這一系統(tǒng)峦筒,所以我在查閱學(xué)習(xí)官方文檔之后,寫下這一篇博客卦碾,也方便大家參考和學(xué)習(xí)。
安裝與配置
django的認(rèn)證系統(tǒng)(Django authentication system)主要處理用戶認(rèn)證和用戶授權(quán)的任務(wù)起宽,其中包含有很多內(nèi)容(Users洲胖、Permissions、Groups等)坯沪,本文只講述Users的基本用法绿映。
環(huán)境
python:3.6
django:1.9.5
安裝配置
在項(xiàng)目的settings.py
文件中做如下配置(若你使用 django-admin startproject
命令建立項(xiàng)目,則以下配置就已經(jīng)包含在settings.py
文件中腐晾,無需額外添加):
- 在
INSTALLED_APPS
中加入:
1叉弦、'django.contrib.auth'
2、'django.contrib.contenttypes'
- 在
MIDDLEWARE_CLASSES
中加入:
1藻糖、'django.contrib.sessions.middleware.SessionMiddleware'
2淹冰、'django.contrib.auth.middleware.AuthenticationMiddleware'
3、'django.contrib.auth.middleware.SessionAuthenticationMiddleware'
添加相關(guān)配置之后巨柒,使用python manage.py migrate
命令即可創(chuàng)建用戶管理必需的數(shù)據(jù)庫表樱拴。
使用
User對象
User對象是用戶管理系統(tǒng)的核心,它包含的基本屬性有:
- username:用戶名(必須)
- password:密碼(必須)
- email:電子郵箱(可選)
- first_name:名(可選)
- last_name:姓(可選)
導(dǎo)入U(xiǎn)ser對象的命令為:
from django.contrib.auth.models import User
創(chuàng)建用戶
最直接創(chuàng)建用戶的方式就是使用create_user()
函數(shù):
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('name','xxx@example.com','password')
#此時(shí)一個(gè)User對象已經(jīng)被創(chuàng)建洋满,你可以修改其屬性并存入數(shù)據(jù)庫
>>> user.last_name = 'Cheng'
>>> user.save()
當(dāng)然晶乔,你也可以直接使用命令行創(chuàng)建一個(gè)超級用戶:
$ python manage.py createsuperuser --username=name --email=xxx@example.com
然后控制臺會要求你輸入密碼,在你輸入密碼結(jié)束之后牺勾,一個(gè)用戶就成功創(chuàng)建了正罢。
修改密碼
與創(chuàng)建用戶相對應(yīng),修改密碼也有兩種方式:
你可以直接使用set_password()
函數(shù):
>>> from django.contrib.auth.models import User
>>> user = User.objects.get(username='name')
>>> user.set_password('new password')
>>> user.save()
你也可以使用命令行修改密碼:
$ python manage.py changepassword *username*
之后根據(jù)控制臺的提示信息禽最,進(jìn)行密碼修改即可腺怯。
用戶驗(yàn)證
django使用sessions
和middleware
將驗(yàn)證系統(tǒng)與request objects掛鉤。
你可以使用request.user
屬性來獲取當(dāng)前用戶川无。若當(dāng)前沒有用戶登錄呛占,則屬性被設(shè)置為AnonymousUser
,否則就是User
的對象懦趋。
你可以使用is_authenticated()
來判斷用戶是否登錄:
if request.user.is_authenticated():
...
else:
...
用戶登錄
你可以使用login(request,user)
函數(shù)進(jìn)行登錄操作晾虑,該函數(shù)的兩個(gè)參數(shù)為HttpRequest對象和User對象。該函數(shù)會將用戶ID保存在session中。以下為官方示例:
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# Redirect to a success page.
else:
# Return a 'disabled account' error message
...
else:
# Return an 'invalid login' error message.
...
其中authenticate()
函數(shù)作用為:根據(jù)用戶名和密碼檢驗(yàn)用戶對象是否合法帜篇,并返回改用戶對象糙捺。
用戶注銷
你可以使用logout(request)
函數(shù)進(jìn)行注銷操作,該函數(shù)只有一個(gè)參數(shù)為HttpRequest對象笙隙。以下為官方示例:
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# Redirect to a success page.
logout
函數(shù)使用注意事項(xiàng):
- 如果沒有用戶登錄洪灯,該函數(shù)不會拋出錯(cuò)誤;
- 當(dāng)你使用該函數(shù)時(shí)竟痰,最近一次
request
的session
中的數(shù)據(jù)會被完全清除签钩,這一點(diǎn)在使用該函數(shù)時(shí)需特別注意。
登錄狀態(tài)檢驗(yàn)
有時(shí)候坏快,你希望用戶只有在登錄狀態(tài)下才能做某些操作铅檩,你就需要檢驗(yàn)當(dāng)前是否處于用戶登錄狀態(tài)。
-
基礎(chǔ)的方法
最簡單的方法就是使用request.user.is_authenticated()
檢驗(yàn)用戶是否登錄莽鸿,若未登錄則拋出異趁林迹或進(jìn)行重定向:
from django.conf import settings
from django.shortcuts import redirect
from django.shortcuts import render
def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
#或者 return render(request, 'myapp/login_error.html')
# ...
-
優(yōu)雅的方法
上一種簡單的方法雖然比較好理解,但是并不優(yōu)雅祥得。如果你在很多地方都需要檢驗(yàn)用戶是否處于登錄狀態(tài)兔沃,就需要寫很多重復(fù)的代碼。
而優(yōu)雅的解決方式就是——使用login_require()
修飾符:
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
login_required(redirect_field_name='next', login_url=None)
功能介紹如下:
- 如果用戶沒有登錄级及,就會重定向到
settings.LOGIN_URL
粘拾,并將當(dāng)前的絕對路徑以query字符串的形式傳遞。例:/accounts/login/?next=/當(dāng)前路徑/
创千。 - 如果用戶已登錄,就會正常地執(zhí)行
view
入偷。 - 修飾符默認(rèn)重定向的傳入?yún)?shù)名為
next
追驴,重定向的地址為settings.LOGIN_URL
。當(dāng)然疏之,你也可以在修飾符中進(jìn)行修改:
1殿雪、將重定向參數(shù)名next
改為redirect_field_name
:
from django.contrib.auth.decorators import login_required
@login_required(redirect_field_name='my_redirect_field')
def my_view(request):
...
2、設(shè)置重定向地址為'/accounts/login/'
:
from django.contrib.auth.decorators import login_required
@login_required(login_url='/accounts/login/')
def my_view(request):
...
注:django的用戶驗(yàn)證系統(tǒng)中有許多與login_required
類似的修飾符锋爪,如permission_required
判斷用戶權(quán)限等等丙曙,具體請查閱官方文檔。
總結(jié)
對于django用戶檢驗(yàn)系統(tǒng)的學(xué)習(xí)就到此結(jié)束了其骄,希望我的筆記對大家使用這一系統(tǒng)有所幫助亏镰。有什么錯(cuò)誤或者不足之處,也歡迎大家批評指正拯爽。
參考資料:django官方文檔