我們在開發乙個**的時候,無可避免的需要設計實現**的使用者系統。此時我們需要實現包括使用者註冊、使用者登入、使用者認證、登出、修改密碼等功能,這還真是個麻煩的事情呢。
django作為乙個完美主義者的終極框架,當然也會想到使用者的這些痛點。它內建了強大的使用者認證系統--auth,它預設使用 auth_user 表來儲存使用者資料。
from django.contrib import auth
auth中提供了許多實用方法:
authenticate()
提供了使用者認證功能,即驗證使用者名稱以及密碼是否正確,一般需要username 、password兩個關鍵字引數。
如果認證成功(使用者名稱和密碼正確有效),便會返回乙個 user 物件。
authenticate()會在該 user 物件上設定乙個屬性來標識後端已經認證了該使用者,且該資訊在後續的登入過程中是需要的。
用法:
user = auth.authenticate(request,username='theuser',password='thepassword')
該函式接受乙個httprequest物件,以及乙個經過認證的user物件。
該函式實現乙個使用者登入的功能。它本質上會在後端為該使用者生成相關session資料。
用法:
from django.contrib.auth import authenticate, logindef my_view(request):
username = request.post['username']
password = request.post['password']
user = authenticate(request, username=username, password=password)
if user is not none:
login(request, user)
# redirect to a success page.
...else:
# return an 'invalid login' error message.
...
logout(request)
該函式接受乙個httprequest物件,無返回值。
當呼叫該函式時,當前請求的session資訊會全部清除。該使用者即使沒有登入,使用該函式也不會報錯。
用法:
from django.contrib.auth import logoutdef logout_view(request):
logout(request)
# redirect to a success page.
is_authenticated()
用來判斷當前請求是否通過了認證。
用法:
def my_view(request):if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.login_url, request.path))
login_requierd()
auth 給我們提供的乙個裝飾器工具,用來快捷的給某個檢視新增登入校驗。
用法:
from django.contrib.auth.decorators import login_required@login_required
def my_view(request):
...
若使用者沒有登入,則會跳轉到django預設的 登入url '/accounts/login/ ' 並傳遞當前訪問url的絕對路徑 (登陸成功後,會重定向到該路徑)。
如果需要自定義登入的url,則需要在settings.py檔案中通過login_url進行修改。
示例:
login_url = '/login/' # 這裡配置成你專案登入頁面的路由
create_user()
auth 提供的乙個建立新使用者的方法,需要提供必要引數(username、password)等。
用法:
from django.contrib.auth.models import useruser = user.objects.create_user(username='使用者名稱',password='密碼',email='郵箱',...)
create_superuser()
auth 提供的乙個建立新的超級使用者的方法,需要提供必要引數(username、password)等。
用法:
from django.contrib.auth.models import useruser = user.objects.create_superuser(username='使用者名稱',password='密碼',email='郵箱',...)
check_password(password)
auth 提供的乙個檢查密碼是否正確的方法,需要提供當前請求使用者的密碼。
密碼正確返回true,否則返回false。
用法:
ok = user.check_password('密碼'
set_password(password)
auth 提供的乙個修改密碼的方法,接收 要設定的新密碼 作為引數。
注意:設定完一定要呼叫使用者物件的s**e方法!!!
用法:
user.set_password(password='')user.s**e()
乙個修改密碼功能的簡單示例
@login_requireddef set_password(request):
user =request.user
err_msg = ''
if request.method == '
post':
old_password = request.post.get('
old_password
', ''
) new_password = request.post.get('
new_password
', ''
) repeat_password = request.post.get('
repeat_password
', ''
) # 檢查舊密碼是否正確
ifuser.check_password(old_password):
ifnot new_password:
err_msg = '
新密碼不能為空
'elif new_password !=repeat_password:
err_msg = '
兩次密碼不一致
'else
: user.set_password(new_password)
user.s**e()
return redirect("
/login/")
else
: err_msg = '
原密碼輸入錯誤
'content =
return render(request, '
set_password.html
', content)
修改密碼示例
user物件的屬性
user物件屬性:username, password
is_active : 是否允許使用者登入, 設定為 false,可以在不刪除使用者的前提下禁止使用者登入。
這內建的認證系統這麼好用,但是auth_user表字段都是固定的那幾個,我在專案中沒法拿來直接使用啊!
比如,我想要加乙個儲存使用者手機號的字段,怎麼辦?
聰明的你可能會想到新建另外一張表然後通過一對一和內建的auth_user表關聯,這樣雖然能滿足要求但是有沒有更好的實現方式呢?
答案是當然有了。
我們可以通過繼承內建的 abstractuser 類,來定義乙個自己的model類。
這樣既能根據專案需求靈活的設計使用者表,又能使用django強大的認證系統了。
from django.contrib.auth.models import abstractuserclass userinfo(abstractuser):
"""使用者資訊表
"""nid = models.autofield(primary_key=true)
phone = models.charfield(max_length=11, null=true, unique=true)
def __str__(self):
return self.username
注意:按上面的方式擴充套件了內建的auth_user表之後,一定要在settings.py中告訴django,我現在使用我新定義的userinfo表來做使用者認證。寫法如下:
# 引用django自帶的user表,繼承使用時需要設定
再次注意:
一旦我們指定了新的認證系統所使用的表,我們就需要重新在資料庫中建立該錶,而不能繼續使用原來預設的auth_user表了。
05 Django模板的使用
在專案下床架乙個模板資料夾 檢視函式必須有乙個引數 進行處理,和m和t進行互動。使用模板檔案 1.載入模板檔案,先import loader temp loader.get template booktest index.html 2.定義模板上下文,向模板檔案傳遞資料 context reques...
django自帶認證系統
使用者 許可權密碼雜湊系統 表單和檢視工具django內建認證系統不支援的板塊 密碼強度 我們通過第三方包解決 限制登入次數 自定義中介軟體解決 物件級許可權 django只支援到模型級 建立普通使用者 使用者資訊儲存在模型類的user表中。可以使用django auth 封裝的create use...
Django自帶的使用者認證
auth模組 from django.contrib import auth auth模組中的方法 authenticate 提供了使用者認證功能,即驗證使用者名稱以及密碼是否正確,一般需要username password兩個關鍵字引數。如果認證成功 使用者名稱和密碼正確有效 便會返回乙個 use...