django-用戶驗證系統

来源:http://www.cnblogs.com/scolia/archive/2016/08/19/5788857.html
-Advertisement-
Play Games

django提供了一套用戶驗證系統,但是要使用這個系統,必須要使用django內置的用戶模型:django.contrib.auth.models.User,這個模型中預先定義了一些欄位,其中只有username和password是必須的。 username 用戶名,該欄位是必須的,長度限製版本之間 ...


django提供了一套用戶驗證系統,但是要使用這個系統,必須要使用django內置的用戶模型:django.contrib.auth.models.User,這個模型中預先定義了一些欄位,其中只有username和password是必須的。   username 用戶名,該欄位是必須的,長度限製版本之間可能存在差異,1.10為150個字元以內(其他版本為30個字元,存在版本差異)。可以是字母、數字、+、-、_、.、@。這幾個字元。在1.10版本中,django正式支持utf-8的用戶名(也就是不受字元限制了),當然前提是要使用python3.x的版本。   當然,你也可以使用max_length、min_length等屬性來控制用戶名的長短限制。下麵的欄位基本也適用。   django在1.10中實現了兩個驗證器,其會根據python版本自動選取,一般不用我們擔心。可以使用username_validator(New in Django 1.10.)屬性查看驗證器:預設 validators.UnicodeUsernameValidator於Python 3 、validators.ASCIIUsernameValidator於Python 2.   當然我們也可以改變驗證器,例如將python3的驗證器改成ASCII的:  
from django.contrib.auth.models import User
from django.contrib.auth.validators import ASCIIUsernameValidator
class CustomUser(User):
  username_validator = ASCIIUsernameValidator()
  class Meta:
    proxy = True # If no new field is added.

 

上面我們首先子類化了User model,然後改變了username_validator屬性,這也是標準的修改步驟。   password 密碼,必須。django不會直接儲存原始密碼,而是儲存經過處理之後的哈希值。所以在創建用戶或修改密碼的時候不能直接操作這個屬性,而是使用django提供的專門的方法,下麵會再說明。   email 可選,表示email地址。   first_name 可選,30個字元以內(在中文環境中應該用不上)   last_name 可選,30個字元以內   groups Many-to-many relationship to GroupGroup屬於多對多的關係,而Group表示的是用戶組,由另一種表儲存。   user_permissions Many-to-many relationship to PermissionPermission屬於多對多的關係,而Permission表示的是許可權,由另一種表儲存。 關於許可權的問題需要另外說明,這裡暫時不討論。   is_active 表用戶是否是活躍的,是一個布爾值。django提議與其刪除一個用戶的所有信息,還不如將其設置為非活躍(即凍結)狀態。這樣不會破壞其他相關的外鍵關係,同時也擁有了後悔的可能。   註意:在1.10之前,django的後臺驗證程式不會檢查用戶是否處於活躍狀態,也就是非活躍的用戶依然可以登錄,此時要自己進行狀態驗證,例如:  
if user.is_active: # 若用戶是活躍的,即未凍結的,在1.10之前凍結用戶預設也能登錄,所以需要自己認證
    login(request, user) # 登錄
    ...... #其他處理
else:
    return HttpResponse('用戶被凍結')

 

在1.10版本中,django的預設驗證後臺會拒絕凍結用戶的訪問了。當凍結的用戶登錄時,會無法通過 authenticate(username=None, password=None, **kwargs) 的驗證,即該方法會返回None。   is_staff 是否為staff身份,布爾值。擁有staff身份的用戶可以登錄django的admin後臺,且可以使用 staff_member_required(redirect_field_name='next', login_url='admin:login') 裝飾器來進行訪問控制。詳情參考 django-訪問控制 篇。   is_superuser 是否是superuser身份,布爾值。擁有該身份的用戶將能夠登錄admin後臺,並擁有所有註冊模型的管理許可權。   last_login 用戶最後登錄的時間。   date_joined 用戶創建的時間。   以上就是django自帶的用戶認證系統使用的模型的全部欄位了,也就是說django在資料庫中儲存的欄位信息就是以上這些,如果需要擴展的話,有兩種方法:   1.另外再寫一個模型,用OneToOne的形式關聯到User中:    
from django.db import models
from django.contrib.auth.models import User
 
 
class UserInfo(models.Model):
    user = models.OneToOneField(User)
    head_img = models.ImageField()
    # 其它擴展

 

  2.另寫一個模型,直接繼承User:  
from django.db import models
from django.contrib.auth.models import User
 
 
class UserInfo(User):
    head_img = models.ImageField()
    # 其它擴展

 

  無論哪種方法都可以,因為那些已經定義好的欄位都是儲存在User表中的,而新增的欄位儲存在另外的表中,只是使用OneToOne的時候,查詢的入口略麻煩了些,詳情參考django的models。  
用戶註冊:   所謂的用戶註冊,其實就是在User表中新創建一條記錄,而前面說過了,password欄位儲存的不是原始密碼,而是加密後的字元串,所以不能直接對User對象的屬性進行修改,而是要調用專用的函數:  
>>> from django.contrib.auth.models import User >>> user = User.objects.create_user('john', '[email protected]', 'johnpassword')

 

此時,用戶就已經創建並放到資料庫中了,這個方法比較特別,其自動為我們保存數據。  
密碼修改:   由於密碼欄位不能直接操作,所以django也提供了函數專門用來修改密碼:  
>>> from django.contrib.auth.models import User 
>>> u = User.objects.get(username='john')
>>> u.set_password('new password') 
>>> u.save()

 

這裡有一個細節,它不像創建賬戶一樣會直接保存的資料庫中,而是調用User對象的save()方法,表示將修改保存到資料庫中。  
資料修改:   其他的欄位可以通過直接修改對象屬性的方法來修改數據,然後調用保存方法。   例如,我想修改用戶的email:  
request.user.email = date['email'] # date的表單提交上來的數據
request.user.save() # 保存修改

 

  一般資料修改需要用戶登錄之後才能修改,而登錄後的用戶可以是使用request.user來獲取當前登錄的用戶,然後我們直接對其email屬性進行修改,數據來自於用戶提交的表單(你可以直接將其看成'[email protected]'這樣的直接的字面量)。最後我們調用其save方法,其實除了password相關的操作需要調用輔助函數之外,其他的基本都能這樣修改,這也是模型數據修改的典型方法。  
用戶驗證:   要實現我們平常需要的驗證登錄的功能,需要兩個步驟,第一步是驗證用戶名和密碼是否正確,第二步將用戶登錄。  
from django.contrib.auth import authenticate
 
user = authenticate(username=date['user_name'], password=date['password'])

 

username和password兩個參數分別接受要登錄用戶的用戶名和密碼,這裡傳的是明文。若驗證通過,其會返回User對象,這個User對象記錄了所用的用戶信息,你可以對這個對象進行資料的修改等之類的操作。若登錄失敗則返回None。   用戶登錄:   驗證成功之後,就可以進行登錄操作了,django提供了專門的登錄函數來處理這個工作:  
from django.contrib.auth import authenticate, login
 
user = authenticate(username=date['user_name'], password=date['password'])

if user is not None:
    login(request, user)
    #.....
else:
    return HttpResponse('用戶名或密碼錯誤')

 

這裡的核心思想就是登錄失敗後,返回的是None,而判斷到user不為None,即驗證成功了,就可以 進行登錄操作了,否則返回錯誤。   這裡詳細的瞭解一下login這個函數:    login(request, user, backend=None)    其中request要求的是HttpRequest對象,也就是視圖的第一個參數所接受到的對象,習慣性的使用request,user要求要登錄的User對象,也就是驗證成功後返回的User對象。backend是1.10中新增的,其作用是指定特點的後臺程式,一般用不著,若有特殊需求可以參考django1.10的官方文檔。   由於HTTP協議是無狀態協議,所以使用的拓展的cookie和session首部來進行狀態記錄,django採用的是session,在登錄成功後,django會給客戶端設置session首部,其一般是一個用戶的ID,而不是用戶的詳細信息。客戶端登錄後訪問時都會回送這個ID,django接受到ID後找到對應的用戶,從而得知當前的訪問是哪個用戶。實現了登錄的功能。  
用戶註銷:   上面說過用戶的狀態是通過session來記錄的,也就是將session設置為空後,即丟失登錄狀態,這就是註銷了。django同樣提供了變數的函數來完成這個工作:    
from django.contrib.auth import logout
 
def logout_view(request):
    logout(request) # Redirect to a success page.

 

讓我們來認識一下這個函數:    logout(request)    其接收的只有一個參數,也就是當前的request對象。其所完成的就是重置session的工作。如果用戶沒有登錄,也不會報錯。   註意:這個還是會清空所有的session,也就是說如果你有不希望被刪除的session的話,要先獲取到相應的session,併在調用logout之後再將其收到添加進去。  
  這裡初步解釋了django中用戶驗證系統的使用,要獲取更多信息可以查看官方文檔,或者個人提供了一份略微翻譯了的文檔:http://note.youdao.com/yws/public/redirect/share?id=b67cd6af80e4c59da71c47b85b5f3253&type=false
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 謹記:在C語言中,當兩種不同類型之間運算時,低位元組長度類型會向高自己長度類型轉換,有符號會向無符號類型轉換。 舉例子如下: 輸出: -1 <= 1 -1 <= 1 當C2與i進行比較時,由於C2是有符號8位,i是無符號32位,根據C語言的規則,c2被轉換成32位,即-1的補碼,故會得出-1>1的結論 ...
  • Python的誕生 Python的創始人吉多·範羅蘇姆(Guido van Rossum),在1989年12月的聖誕節期間,為了打發時間,決定開發一種新的腳本解釋程式,作為ABC語言的繼承。 現在,python以其優美,清晰,簡單的特性在全世界廣泛流行,成為最主流的編程語言之一。 截止至2016年7 ...
  • 先來看一段簡單的代碼: 輸出結果為: 由此可見,定義:在Eat(冒號函數)內部有一個參數self,在Sleep(點函數)內部沒有參數self;調用:用冒號(:)調用函數時,會預設傳一個值(調用者自身)作為第一個參數;用點(.)調用函數時,則沒有; -- 如果要使結果一致,則: 輸出結果: -- 我們 ...
  • DBCP連接池簡介 1、資料庫連接基礎 資料庫連接池基礎主要包括以下三個方面的內容:資料庫連接池的基本概念、資料庫連接池的工作原理、Java開源的連接池。下麵將從這三個方面一一介紹: (1)資料庫連接池的基本概念 資料庫連接是一種關鍵的、有限的、昂貴的資源,這一點在多用戶的Web應用程式中體現得尤為 ...
  • 這篇博客總結了半天,希望自己以後返回來看的時候理解更深刻,也希望可以起到幫助初學者的作用. 轉載請註明 出自 : "luogg的博客園" , 抽象 一種專門用來做父類,被繼承的. (模板) 格式: abstract class 抽象類名{ 屬性; 普通方法; 訪問許可權 abstract 返回值類型 ...
  • 在 Python 的Lib目錄里有一個:this.Py (或者在互動式解釋器中輸入import this) 它其實是隱藏的一首詩 ...
  • 題目是說給出一個數字,然後以1到這個數為序號當做二叉樹的結點,問總共有幾種組成二叉樹的方式。這個題就是用卡特蘭數算出個數,然後因為有編號,不同的編號對應不同的方式,所以結果是卡特蘭數乘這個數的階乘種方案。因為數字比較大,所以要用高精度的方法也就是用字元數組來做,我分別寫了三個函數,一個算加法,一個算 ...
  • 傳送門:hdu 5862 Counting Intersections 題意:對於平行於坐標軸的n條線段,求兩兩相交的線段對有多少個,包括十,T型 官方題解:由於數據限制,只有豎向與橫向的線段才會產生交點,所以先對橫向線段按x端點排序,每次加入一個線段,將其對應的y坐標位置+1,當出現一個豎向線段時 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...