Django-內置用戶系統

Django自帶的用戶認證

我們在開發一個網站的時候,無可避免的需要設計實現網站的用戶系統。此時我們需要實現包括
1.用戶注冊
2.用戶登錄
3.用戶認證
4.注銷
5.修改密碼

Django作為一個完美主義者的終極框架,當然也會想到用戶的這些痛點。它內置了強大的用戶認證系統--auth,它默認使用 auth_user 表來存儲用戶數據。

auth模塊

from django.contrib import auth

auth中提供了許多實用方法:

authenticate()

提供了用戶認證功能,即驗證用戶名以及密碼是否正確,一般需要username 、password兩個關鍵字參數。
如果認證成功(用戶名和密碼正確有效),便會返回一個 User 對象
authenticate()會在該 User 對象上設置一個屬性來標識后端已經認證了該用戶,且該信息在后續的登錄過程中是需要的。

用法:

user = authenticate(username='theuser',password='thepassword')

login(HttpRequest, user)

該函數接受一個HttpRequest對象,以及一個經過認證的User對象。
該函數實現一個用戶登錄的功能。它本質上會在后端為該用戶生成相關session數據

用法:

from django.contrib.auth import authenticate, logindef my_view(request):username = request.POST['username']password = request.POST['password']user_obj = authenticate(username=username, password=password)if user_obj:login(request, user_obj)# Redirect to a success page....else:# Return an 'invalid login' error message....

注意:
只要使用login(request, user_obj)之后,request.user就能拿到當前登錄的用戶對象。否則request.user得到的是一個匿名用戶對象(AnonymousUser Object)。
詳細原理請查看 AuthenticationMiddleware 中間件源碼。

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 User
user = User.objects.create_user(username='用戶名',password='密碼',email='郵箱',...)

create_superuser()

auth 提供的一個創建新的超級用戶的方法,需要提供必要參數(username、password)等。
用法:

from django.contrib.auth.models import User
user_obj = User.objects.create_superuser(username='用戶名',password='密碼',email='郵箱',...)

check_password(raw_password)

auth 提供的一個檢查密碼是否正確的方法,需要提供當前請求用戶的密碼。
密碼正確返回True,否則返回False。
用法:

ok = user_obj.check_password('密碼')

或者直接針對當前請求的user對象校驗原密碼是否正確:

ok = request.user.check_password(raw_password='原密碼')

set_password(raw_password)

auth 提供的一個修改密碼的方法,接收 要設置的新密碼 作為參數。
注意:設置完一定要調用用戶對象的save方法!!!
用法:

user_obj.set_password('新密碼')
user_obj.save()

一個修改密碼功能的簡單示例

@login_required
def set_password(request):user = request.usererr_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', '')# 檢查舊密碼是否正確if user.check_password(old_password):if not new_password:err_msg = '新密碼不能為空'elif new_password != repeat_password:err_msg = '兩次密碼不一致'else:user.set_password(new_password)user.save()return redirect("/login/")else:err_msg = '原密碼輸入錯誤'content = {'err_msg': err_msg,}return render(request, 'set_password.html', content)

用戶對象的屬性

user_obj能夠拿到認證所用用戶表的數據屬性,比如username, password等。
其他常用屬性含義如下:
is_staff : 用戶是否擁有網站的管理權限.
is_active : 是否允許用戶登錄, 設置為 False,可以在不刪除用戶的前提下禁止用戶登錄。

擴展默認的auth_user表

這內置的認證系統這么好用,但是auth_user表字段都是固定的那幾個,我在項目中沒法拿來直接使用啊!
比如,我想要加一個存儲用戶手機號的字段,怎么辦?
聰明的你可能會想到新建另外一張表然后通過一對一和內置的auth_user表關聯,這樣雖然能滿足要求但是有沒有更好的實現方式呢?
答案是當然有了。
我們可以通過繼承內置的 AbstractUser 類,來定義一個自己的Model類。
這樣既能根據項目需求靈活的設計用戶表,又能使用Django強大的認證系統了。

from django.contrib.auth.models import AbstractUser
class 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_MODEL = "app名.UserInfo"

自定義認證系統默認使用的數據表之后,我們就可以像使用默認的auth_user表那樣使用我們的UserInfo表了。比如:
創建普通用戶:

UserInfo.objects.create_user(username='用戶名', password='密碼')

創建超級用戶:

UserInfo.objects.create_superuser(username='用戶名', password='密碼')

再次注意:
一旦我們指定了新的認證系統所使用的表,我們就需要重新在數據庫中創建該表,而不能繼續使用原來默認的auth_user表了。

轉載于:https://www.cnblogs.com/Paul-watermelon/p/11240265.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392220.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392220.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

React 與 可視化

一般會想到 canvas 和 svg ; svg更適合畫圖, 但由于cavans在移動端的良好兼容性, 使用的更廣; 什么是svg, scalable vector graphics 全稱 可縮放矢量圖形, 是一種來描述二維矢量圖形的xml語言 canvas 能做的 svg基本都可以做, 字體圖標, icon, logo 也能作 在ie上也是從ie9開…

css 跳動的心_如何用純CSS為您的情人打造一顆跳動的心

css 跳動的心Each year on February 14th, many people exchange cards, candies, gifts or flowers with their special “valentine”. The day of romance we call Valentine’s Day is named for a Christian martyr and dates back to the 5th century, but has origins i…

oracle怎么獲取行,在oracle中如何實現SELECT TOP N取得前幾行記錄

在sql server中可以通過SELECT TOP N來取得想要結果的前幾行的信息。但是在oracle中必須借助偽列rownum來完成一個查詢語句在取得結果集后,偽列rownum就會從1開始,從上往下依次遞增。rownum是對結果集的編序排列。例如下表:SQL> select id…

圖片管理程序(Java)

圖片管理程序 gitee完整代碼下載 github完整代碼下載 華南農業大學課程設計作品(99分) 問題描述 題目目的是編寫一個能夠對數字像片進行管理的應用程序。 程序能夠顯示的圖片格式包括,.JPG、.JPEG、.GIF、.PNG、和.BMP。 圖像文件尺寸,要求能夠處理從…

氣流與路易吉,阿戈,MLFlow,KubeFlow

任務編排工具和工作流程 (Task orchestration tools and workflows) Recently there’s been an explosion of new tools for orchestrating task- and data workflows (sometimes referred to as “MLOps”). The quantity of these tools can make it hard to choose which o…

移動WEB開發之JS內置touch事件[轉]

iOS上的Safari也支持click 和mouseover等傳統的交互事件,只是不推薦在iOS的瀏覽器應用上使用click和mouseover,因為這兩個事件是為了支持鼠標點擊而設計 出來的。Click事件在iOS上會有半秒左右的延遲,原因是iOS要highlight接收到click的eleme…

編寫代碼的軟件用什么編寫的_如何通過像編寫代碼一樣克服對編寫的恐懼

編寫代碼的軟件用什么編寫的by Chris Rowe通過克里斯羅 How often do you get the fear? What do I mean by fear? How about the knot I got in my stomach just before I plunged out of plane on a parachute jump? It’s more than the brain logically planning to av…

快速學習一個新的模塊

1、模塊名.__doc__查看函數簡介,為了便于查看,采用print(模塊名.__doc__)打印出來,這樣的格式便于查看。 2、采用內置方法dir()查看模塊的變量、函數、類等等;采用"模塊名.__all__"查看模塊中提供…

php 公鑰格式轉換,如何把OpenSSH公鑰轉換成OpenSSL格式

《如何把OpenSSH公鑰轉換成OpenSSL格式》要點:本文介紹了如何把OpenSSH公鑰轉換成OpenSSL格式,希望對您有用。如果有疑問,可以聯系我們。首先看看OpenSSL工具的簡單使用方法,我們以rsa加密算法為例生成一個私鑰:openssl genrsa -o…

模擬操作系統(Java)

gitee完整代碼下載 github完整代碼下載 一、 需求分析 模擬一個采用多道程序設計方法的單用戶操作系統,該操作系統包括進程管理、存儲管理、設備管理、文件管理和用戶接口四部分。預計程序所能達到的功能: 進程管理模擬:實現操作系統進程管…

數據庫面試復習_數據科學面試復習

數據庫面試復習大面試前先刷新 (REFRESH BEFORE THE BIG INTERVIEW) 介紹 (Introduction) I crafted this study guide from multiple sources to make it as comprehensive as possible. This guide helped me prepare for both the technical and behavioral aspects of the …

hibernate緩存

(轉自:http://www.cnblogs.com/java-class/p/6108175.html) 閱讀目錄 1. 為什么要用 Hibernate 緩存?2. 項目實戰3. Hibernate 緩存原理回到頂部1. 為什么要用 Hibernate 緩存? Hibernate是一個持久層框架,…

oracle 連接greenplum,Oracle通過DBLINK訪問GreenPlum

為多個數據庫之間的整合和遷移做POC,嘗試使用Oracle Gateway和Heterogeneous Service來中轉訪問,測試過好多次,最終發現只有在32位的Oracle當中才能成功配置。 配置環境如下: Windows 2003 32bit 或 Windows 2008 64bit Oracle10G…

如何使用React和Redux前端創建Rails項目

by Mark Hopson馬克霍普森(Mark Hopson) 如何使用React和Redux前端(加上Typescript!)創建Rails項目 (How to create a Rails project with a React and Redux front-end (plus Typescript!)) 在Rails項目中使用React和Redux設置單頁Javascript App的完整指南。 (A …

分布與并行計算—用任務管理器畫CPU正弦曲線(Java)

class drawSin implements Runnable{Overridepublic void run() {final double SPLIT 0.01;// 角度的分割final int COUNT (int) (2 / SPLIT);// 2PI分割的次數,也就是2/0.01個,正好是一周final double PI Math.PI;final int interval 100;// 時間間…

Rails文件上傳file_field報錯Encoding::UndefinedConversionError

服務器用的是ubuntu12 64bit,環境是ruby1.9.3rails3mysql,測試是在windows2003上。 上傳一個【.gitconfig】文件,沒有問題,上傳【新浪微博數據挖掘.pdf】報錯,上傳【back.jpg】報錯。 下面是兩段信息,是從【…

好久不來這里寫東西了.

我正準備離開學校去實現自己的目標,很清楚自己在學校的... ...做共享程序員,就不得不考慮些商業上的東西,自己要吃飯啊!我想我是該好好的處理一下這二者的關系. 轉載于:https://www.cnblogs.com/wangxiang/archive/2007/01/01/609714.html

Asp.net mvc中使用配置Unity

第一步:添加unity.mvc 第二步:在添加之后會在app_start中生成UnityConfig.cs,UnityMvcActivator.cs 第三步:使用 第四步:效果展示 轉載于:https://www.cnblogs.com/WJ--NET/p/7117839.html

頂級數據恢復_頂級R數據科學圖書館

頂級數據恢復Data science is the discipline of making data useful數據科學是使數據有用的學科 When we talk about the top programming language for Data Science, we often find Python to be the best fit for the topic. Sure, Python is undoubtedly an excellent cho…

xp系統oracle數據庫,Oracle10g 數據庫的安裝基于windowsXP

Oracle的安裝一、首先去官網下載自身系統相對應的數據庫軟件http://www.oracle.com/cn/index.htmlOracle軟件本身是免費的,個人用途完全沒關系,商業用途并被發現才會被Oracle所要求收費,收費買的不是軟件,而是授權。何謂授權&…