Django中的用戶身份驗(yàn)證示例詳解
前言
這次開發(fā)微信搶票程序中,普通用戶的身份是由微信管理的。當(dāng)用戶通過微信公眾號(hào)(測試號(hào))向后臺(tái)發(fā)消息時(shí),微信會(huì)將用戶的身份標(biāo)記為一個(gè)unique_id來識(shí)別,后端可以由此來判斷用戶身份。這種認(rèn)證比較特殊,它不存在登陸、登出的操作。如果是一個(gè)普通的web應(yīng)用,應(yīng)該有用戶的登陸、登出操作,當(dāng)用戶未經(jīng)授權(quán)訪問某個(gè)URL的時(shí)候,后端應(yīng)該拒絕這次請(qǐng)求,或者是重定向到登陸界面。
在這次作業(yè)中,因?yàn)樾枰粋€(gè)后臺(tái)管理員來管理各種活動(dòng)的創(chuàng)建和發(fā)布,因此也需要有用戶的身份認(rèn)證操作。這次的后端是Django,試了一下發(fā)現(xiàn)Django實(shí)現(xiàn)了一套自己的身份驗(yàn)證的API,用起來非常方便。
用戶創(chuàng)建與修改
眾所周知,Django中存儲(chǔ)數(shù)據(jù)的原型稱為Model,User就是Django中用戶的Model,不需要程序員在models.py中自己定義。它有username、password、email、first_name、last_name五個(gè)屬性。在Django中還有一個(gè)稱為superuser的用戶,它其實(shí)是User的一個(gè)特殊的子類,在本次微信搶票中,后臺(tái)管理員就是superuser。
普通User的創(chuàng)建是調(diào)用User中的create_user進(jìn)行創(chuàng)建,而superuser的創(chuàng)建不是在代碼中,而是輸入python manage.py createsuperuser進(jìn)行創(chuàng)建。
#普通用戶的創(chuàng)建 from django.contrib.auth.models import User user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword') user.last_name = 'Lennon' user.save()
用戶登陸登出
在登陸時(shí),使用authenticate的函數(shù)對(duì)用戶進(jìn)行驗(yàn)證,如果用戶名、密碼錯(cuò)誤,該函數(shù)的返回值為None。此時(shí)嗲用login函數(shù)將request與該user綁定起來。login的結(jié)果是,以后每次的request,在request.user中總會(huì)存在用戶的信息,這是下一步我們進(jìn)行權(quán)限認(rèn)證的前提。用戶的退出就是調(diào)用logout(request)函數(shù)即可。
用戶權(quán)限
request.user.is_authenticated()
一般的情況下(比如在本次微信搶票中),只需要有兩種訪問可能。一個(gè)是用戶已登陸,可以訪問,一個(gè)是用戶未登陸,禁止訪問。因此我們用這個(gè)函數(shù)就足夠了。(我們確實(shí)是這么用的2333)
當(dāng)然還有一種更簡單的用法——函數(shù)的裝飾器,因?yàn)槲覀冇玫氖穷愖鱿鄳?yīng),因此不適合微信搶票程序,但是還是mark一下,因?yàn)榇_實(shí)太方便了。就是在函數(shù)的前面加上login_required()裝飾器,括號(hào)中可以填入如果未登陸應(yīng)該重定向到哪個(gè)頁面。
但是在其它web應(yīng)用中,我們需要不同的用戶組有不同的權(quán)限,這個(gè)時(shí)候Django提供了另外一個(gè)叫做permission的屬性。
首先,每個(gè)用戶都有一個(gè)group外鍵,可以給用戶分配在某些group中,然后可以通過group.permissions來修改group的permission列表。
在使用permission的時(shí)候,同樣可以使用裝飾器require_permission。
除此之外,還有一個(gè)值得提的地方:裝飾器user_passes_test(xxtest),可以自己編寫一個(gè)test函數(shù)來測試用戶是否可以訪問,test函數(shù)接收的參數(shù)為request.user
from django.contrib.auth.decorators import user_passes_test def email_check(user): return user.email.endswith('@example.com') @user_passes_test(email_check) def my_view(request): ...
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Python3.8如何解決No module named 'numpy&apos
這篇文章主要介紹了Python3.8如何解決No module named 'numpy'報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06詳解如何使用Plotly和Dash進(jìn)行數(shù)據(jù)可視化
數(shù)據(jù)可視化是數(shù)據(jù)分析中至關(guān)重要的一環(huán),它能夠幫助我們更直觀地理解數(shù)據(jù)并發(fā)現(xiàn)隱藏的模式和趨勢,本文將介紹如何使用Plotly和Dash進(jìn)行數(shù)據(jù)可視化,感興趣的可以了解下2024-04-04python集成開發(fā)環(huán)境配置(pycharm)
本文是python快速進(jìn)階系列文章的第一篇,給大家介紹的是python集成開發(fā)環(huán)境pycharm的配置,有需要的小伙伴可以參考下2020-02-02