Web框架之Django_10 重要組件(Auth模塊)
閱讀目錄
-
一、auth模塊介紹
-
二、auth模塊常用方法
create_superuser()
create_user()
authenticate()
login(HttpRequest, user)
logout(request)
is_authenticated()
login_requierd()
check_password(password)
set_password(password)
User對象的屬性 -
三、擴展默認的auth_user表
一、auth模塊介紹
Auth模塊是Django自帶的用戶認證模塊:
我們在開發一個網站的時候,無可避免的需要設計實現網站的用戶系統。此時我們需要實現包括用戶注冊、用戶登錄、用戶認證、注銷、修改密碼等功能,這還真是個麻煩的事情呢。
Django作為一個完美主義者的終極框架,當然也會想到用戶的這些痛點。它內置了強大的用戶認證系統–auth,它默認使用 auth_user 表來存
二、auth模塊常用方法
from django.contrib import auth
create_superuser()
auth 提供的一個創建新的超級用戶的方法,需要提供必要參數(username、password)等。
用法:
from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用戶名',password='密碼',email='郵箱',...)
還可以在菜單欄tool中Run manage.py Task下進行命令行創建超級用戶:createsuperuser然后根據提示創建即可
create_user()
auth 提供的一個創建新用戶的方法,需要提供必要參數(username、password)等,該方法和創建超級用戶一樣,只不過用戶權限會有差別
用法:
from django.contrib.auth.models import User
user = User.objects.create_user(username='用戶名',password='密碼',email='郵箱',...)
tip:Run manage.py Task下無法創建普通用戶
authenticate()
提供了用戶認證功能,即驗證用戶名以及密碼是否正確,一般需要username 、password兩個關鍵字參數。
如果認證成功(用戶名和密碼正確有效),便會返回一個 User 對象。
authenticate()會在該 User 對象上設置一個屬性來標識后端已經認證了該用戶,且該信息在后續的登錄過程中是需要的。
用法:
user = authenticate(username='usernamer',password='password') # 用戶名和密碼都要傳才行
login(HttpRequest, user)
該函數接受一個HttpResponse對象,以及一個經過認證的User對象
該函數實現一個用戶登錄的功能,本質上會在后端為該用戶生成相關的session數據
用法:
--------------------------------------------------------------------
注:如果你對python感興趣,我這有個學習Python基地,里面有很多學習資料,感興趣的+Q群:895817687
--------------------------------------------------------------------
urls.py
url(r'^login/', views.my_login),
views.py
from django.contrib.auth import authenticate,login
def my_login(request):
if request.method == 'POST':
# 獲取前端賬號密碼
username = request.POST['username']
password = request.POST['password']
# 用戶認證
user = authenticate(username=username, password=password)
# 用戶認證成功
if user:
# 實現用戶登錄功能,為該用戶創建生成session數據
login(request, user) # 這里只要執行了login(request, user),在后端任何地方都可以通過request.user拿到當前登錄的用戶對象
return render(request, 'index.html')
# 認證不成功,說明用戶名密碼錯誤
else:
return HttpResponse('用戶名或密碼錯誤,登錄失敗')
return render(request, 'login.html')
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<p>用戶名:<input type="text" name="username"></p>
<p>密碼:<input type="password" name="password"></p>
<p><input type="submit"></p>
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主頁面</title>
</head>
<body>
<h1>我是登錄后才能看到的頁面</h1>
</body>
</html>
logout(request)
該函數接受一個HttpRequest對象,無返回值。
當調用該函數時,當前請求的session信息會全部清除。該用戶即使沒有登錄,使用該函數也不會報錯。
用法:
from django.contrib.auth import logout
def my_logout(request):
logout(request)
return redirect('/home/')
def my_home(request):
return render(request, 'home.html')
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_required(login_url='/auth_login/')
# 全局配置
# auth自動跳轉
LOGIN_URL = '/auth_login/' # settings.py配置
實例:
# 導入用戶認證模塊和login函數
from django.contrib.auth import authenticate,login
def my_login(request):
if request.method == 'POST':
# 獲取前端賬號密碼
username = request.POST['username']
password = request.POST['password']
next_url = request.GET.get('next') # 獲取到跳轉過來的原頁面的url
# 用戶認證
user = authenticate(username=username, password=password)
# 用戶認證成功
if user:
# 實現用戶登錄功能,為該用戶創建生成session數據
login(request, user)
return redirect(next_url) # 登錄成功自動跳轉到原來的頁面
# 認證不成功,說明用戶名密碼錯誤
else:
return HttpResponse('用戶名或密碼錯誤,登錄失敗')
return render(request, 'login.html')
from django.contrib.auth.decorators import login_required
# Django登錄驗證裝飾器在跳轉到登陸頁面時候會自動在頁面末尾拼接一個?next=當前url
@login_required
def my_home(request):
return render(request, 'home.html')
check_password(password)
auth 提供的一個檢查密碼是否正確的方法,需要提供當前請求用戶的密碼。
密碼正確返回True,否則返回False。
用法:
ok = user.check_password('密碼')
set_password(password)
auth 提供的一個修改密碼的方法,接收 要設置的新密碼 作為參數。
注意:設置完一定要調用用戶對象的save方法!!!
用法:
user.set_password(password='')
user.save(
修改密碼示例:
修改密碼
User對象的屬性
User對象屬性:username, password
is_staff : 用戶是否擁有網站的管理權限.
is_active : 是否允許用戶登錄, 設置為 False,可以在不刪除用戶的前提下禁止用戶登錄。
三、擴展默認的auth_user表
這內置的認證系統這么好用,但是auth_user表字段都是固定的那幾個,我在項目中沒法拿來直接使用啊!
比如,我想要加一個存儲用戶手機號的字段,怎么辦?
聰明的你可能會想到新建另外一張表然后通過一對一和內置的auth_user表關聯,這樣雖然能滿足要求但是有沒有更好的實現方式呢?
答案是當然有了。
我們可以通過繼承內置的 AbstractUser 類,來定義一個自己的Model類。
這樣既能根據項目需求靈活的設計用戶表,又能使用Django強大的認證系統了。
# app01下models.py文件中
from django.db import models
from django.contrib.auth.models import User,AbstractUser
# 讓拓展的auth_user表:userinfo繼承AbstractUser,這樣userinfo表擁有了原來auth_user表的所有屬性(字段)
class Userinfo(AbstractUser):
phone = models.CharField(max_length=32)
avatar = models.CharField(max_length=32)
需要注意:
按上面的方式擴展了內置的auth_user表之后,一定要在settings.py中告訴Django,我現在使用我新定義的UserInfo表來做用戶認證。寫法如下:
#引用Django自帶的User表,繼承使用時需要設置
AUTH_USER_MODEL = "app名.UserInfo"
再次注意:
一旦我們指定了新的認證系統所使用的表,我們就需要重新在數據庫中創建該表,而不能繼續使用原來默認的auth_user表了。
示例:
這里需要注意:如果在設置完做數據庫遷移命令migrate的時候報錯:
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.0001_initial on database ‘default’
解決方法是:刪除數據庫中 除了auth_user的其他表,然后重新來一次
智能推薦
django之auth系統
1-Auth系統中的表 (1)auth系統的數據表 從表的名稱我們就能看出, auth_user,auth_group,auth_permission分別 存放了用戶,用戶組,權限的信息表. 另外三張表就是多對多的關系表 User:User是auth模塊中維護用戶信息的關系模式(繼承了models.Model), 數據庫中該表被命名為auth_user. Group:User對象中有一個名為gro...
【Django】Django用戶認證: 利用Django Auth模塊實現用戶注冊、登錄與登出
Django用戶認證: 利用Django Auth模塊實現用戶注冊、登錄與登出 用戶登錄注冊屬于用戶認證的一部分,Django內置了一套用戶認證體系,使用起來比較方便,而且支持用戶定制和拓展,足以滿足任何復雜的業務需求。 目錄 Django用戶認證: 利用Django Auth模塊實現用戶注冊、登錄與登出 1 Django 用戶管理機制 2 Auth模塊 2.1 配置權限管理模塊 2.2 Auth...
web框架之Django
web框架和Django流程 1.web框架要點 1.Web應用程序處理流程 2.Web應用程序框架的意義 用于搭建Web應用程序 免去不同Web應用相同代碼部分的重復編寫,只需關心Web應用核心的業務邏輯實現 3.web應用程序的本質 接收并解析HTTP請求,獲取具體的請求信息 處理本次HTTP請求,即完成本次請求的業務邏輯處理 構造并返回處理結果——HTTP響應 4.w...
Web框架之Django
一、Django的簡介 Django是一個開放源代碼的Web應用框架,由Python寫成。采用了MT’V的框架模式,即模型M,模板T和視圖V。它最初是被開發來用于管理勞倫斯出版集團旗下的一些以新聞內容為主的網站的,即是CMS(內容管理系統)軟件。并于2005年7月在BSD許可證下發布。這套框架是以比利時的吉普賽爵士吉他手Django Reinhardt來命名的。 二、Django開發環...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...