一:Auth模塊
1.什么是Auth模塊?
Auth模塊是Django自帶的用戶認證模塊:
1.我們在開發一個網站的時候,無可避免的需要設計實現網站的用戶系統。此時我們需要實現包括用戶注冊、用戶登錄、用戶認證、注銷、修改密碼等功能,這還真是個麻煩的事情呢。
2.Django作為一個完美主義者的終極框架,當然也會想到用戶的這些痛點。它內置了強大的用戶認證系統–auth,它默認使用 auth_user 表來存儲用戶數據。
2.Auth模塊作用
1 django提供的用戶認證,創建,修改密碼。。。用戶相關操作
2 不需要創建用戶表了,默認帶了
3 插入數據(創建用戶):
python3 manage.py createsuperuser
二:引入Auth模塊
1.其實我們在創建好一個Django項目之后直接執行數據庫遷移命令會自動生成很多表
列如:
django_session
auth_user
2.django在啟動之后就可以直接訪問admin路由,需要輸入用戶名和密碼,數據參考的就是auth_user表,並且還必須是管理員用戶才能進入
3.創建超級用戶(管理員)
python3 manage.py createsuperuser
4.Django自帶的admin后端管理
5.需求
- 依賴於auth_user表完成用戶相關的所有功能
6.方法總結
問題(1.表如何獲取 2.密碼如何比對 存儲表中密碼是密文的)
三:解決方法(auth模塊)
1.自動查詢auth_user標簽
2.自動給密碼加密再比對
該方法注意事項:
括號內必須同時傳入用戶名和密碼
不能只傳用戶名(一步就幫你篩選出用戶對象)
1.比對用戶名和密碼是否正確
# 導入auth模塊
from django.contrib import auth
# 1.比對用戶名和密碼是否正確
user_obj = auth.authenticate(request,username=username,password=password)
# 括號內必須同時傳入用戶名和密碼
print(user_obj) # 用戶對象 jason 數據不符合則返回None
print(user_obj.username) # jason
print(user_obj.password) # 密文
2.保存用戶狀態
auth.login(request,user_obj) # 類似於request.session[key] = user_obj
# 主要執行了該方法 你就可以在任何地方通過request.user獲取到當前登陸的用戶對象
3.獲取當前登陸用戶
print(request.user) # 用戶對象 沒登陸拿到的是匿名用戶 AnonymousUser
# 自動去django_session里面查找對應的用戶對象給你封裝到request.user中
4.判斷當前用戶是否登陸
request.user.is_authenticated()
5.校驗用戶是否登陸裝飾器
from django.contrib.auth.decorators import login_required
# 局部配置
@login_required(login_url='/login/')
# 全局配置settings內
LOGIN_URL = '/login/'
1.如果局部和全局都有 該聽誰的?
局部 > 全局
2.局部和全局哪個好呢?
全局的好處在於無需重復寫代碼 但是跳轉的頁面卻很單一
局部的好處在於不同的視圖函數在用戶沒有登陸的情況下可以跳轉到不同的頁面
6.比對原密碼
# 校驗老密碼 check_password 原密碼
# 返回值就是一個布爾值
is_right = request.user.check_password(old_password) # 自動加密比對密碼
7.修改密碼
# 判斷原密碼正常為True 原密碼錯誤為False
if is_right:
# 修改密碼
request.user.set_password(new_password) # 添入新密碼(僅僅修改對象的屬性)
request.user.save() # 操作數據庫
return redirect('/login/')
8.注銷
auth.logout(request) # 類似於 request.session.flush()
9.注冊
1.操作auth_user表寫入數據
User.objects.create(username=username,password=password) # 寫入數據 不能用create 密碼沒有加密處理
2.創建普通用戶 # 加密處理
User.objects.create_user(username=username,password=password)
3.創建超級用戶(了解):使用代碼創建超級用戶 郵箱是必填的 而用命令創建則可以不填
User.objects.create_superuser(username=username,email='123@qq.com',password=password)
10.整體代碼
###### 10.整體代碼
```python
# views.py
from django.shortcuts import render, HttpResponse, redirect
from django.contrib import auth
#登陸
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 去用戶表中效驗數據
# 1.表如何獲取
# 2.密碼如何比對 存儲表中密碼是密文的
# 使用auth模塊
user_obj = auth.authenticate(request, username=username, password=password)
# 判斷當前用戶是否存在
if user_obj:
# 保存用戶狀態(利用auth操作session表)
auth.login(request, user_obj) # 類似於request.session[key] = user_obj 將用戶對象存到session表內
return render(request, 'login.html')
from django.contrib.auth.decorators import login_required
# 主頁
# 局部配置: 用戶沒有登陸跳轉到login_user后面指定的網址
# @login_required(login_url='/login/') # 優先級 局部 大於 全局
@login_required
def home(request):
print(request.user) # 用戶對象 沒登陸拿到的是匿名用戶 AnonymousUser
# 判斷用戶是否登陸
print(request.user.is_authenticated())
# 自動去django_session里面查找對應的用戶對象給你封裝到request.user中
return HttpResponse('home')
@login_required
def index(request):
return HttpResponse('index')
# 修改
@login_required
def set_password(request):
if request.method == 'POST':
old_password = request.POST.get('old_password')
new_password = request.POST.get('new_password')
confirm_password = request.POST.get('confirm_password')
# 校驗兩次密碼是否一致
if new_password == confirm_password:
# 校驗老密碼 check_password 原密碼
# 返回值就是一個布爾值
is_right = request.user.check_password(old_password) # 自動加密比對密碼
# 判斷原密碼正常為True 原密碼錯誤為False
if is_right:
# 修改密碼
request.user.set_password(new_password) # 添入新密碼(僅僅修改對象的屬性)
request.user.save() # 操作數據庫
return redirect('/login/')
return render(request, 'set_password.html', locals())
# 注銷
@login_required
def logout(request):
auth.logout(request) # 類似於 request.session.flush()
return redirect('/login/')
from django.contrib.auth.models import User
# 注冊
@login_required
def register(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 操作auth_user表寫入數據
# User.objects.create(username=username, password=password) # 寫入數據 不能使用create 密碼沒有加密處理
# 創建普通用戶 加密處理
User.objects.create_user(username=username, password=password)
return render(request, 'registration.html')
# settings.py
# 全局配置 沒有登陸跳轉到指定頁面
LOGIN_URL = '/login/'
# urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 1.登陸功能
url(r'^login/', views.login),
# 2.主頁(校驗用戶是否登陸)
url(r'^home/', views.home),
url(r'^index/', views.index),
# 3.修改密碼
url(r'^set_password/', views.set_password),
# 4.注銷功能
url(r'^logout/', views.logout),
# 5.注冊功能
url(r'^register/', views.register),
]
# login.html
<form action="" method="post">
{% csrf_token %}
<p>username: <input type="text" name="username"></p>
<p>password: <input type="text" name="password"></p>
<input type="submit">
</form>
# registration.html
<form action="" method="post">
{% csrf_token %}
<h1>注冊</h1>
<p>username: <input type="text" name="username"></p>
<p>password: <input type="text" name="password"></p>
<input type="submit">
</form>
# set_password.html
<form action="" method="post">
{% csrf_token %}
{# disabled 只能看 不能改 #}
<p>username: <input type="text" name="username" disabled value="{{ request.user.username }}"></p>
<p>old_password: <input type="text" name="old_password"></p>
<p>new_password: <input type="text" name="new_password"></p>
<p>confirm_password: <input type="text" name="confirm_password"></p>
<input type="submit">
</form>
四:如何擴展auth_user表
1.需求:
- 擴展auth_user字段
2.如果繼承了AbstractUser會如何?
1.那么在執行數據庫遷移命令的時候auth_user表就不會再創建出來了
2.而userInfo表中出現auth_user所有的字段外加自己擴展的字段
3.優點
1.這么做的好處在於你能夠直接點擊你自己的表更加快速的完成操作及擴展
4.實現該方法前提:
1.在繼承之前沒有執行過數據庫遷移命令(auth_user沒有被創建)
如果當前庫已經創建了,那么你就重新換一個庫
2.繼承的類里面不要覆蓋AbstractUser里面的字段名
表里面有的字段都不要動,只擴展額外字段即可
3.需要在配置文件中告訴Django你要用UserInfo替代auth_user
AUTH_USER_MODEL = 'app01.UserInfo'
直接應用名點表名即可
5.擴展auth_user字段實踐
- models
from django.db import models
from django.contrib.auth.models import User, AbstractUser
# User繼承了AbstractUser, auth_user內的字段來自AbstractUser類
# 1.利用面向對象的繼承
class UserInfo(AbstractUser):
phone = models.BigIntegerField()
6.實現擴展
1.__init__.py
# 切換到pymysql
import pymysql
pymysql.install_as_MySQLdb()
2.配置文件settings更改數據庫mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day00',
'USER': 'root',
'PASSWORD': '123',
'HOST': '127.0.0.1',
'PORT': 3306,
'CHARSET': 'utf8',
}
}
3.auth表配置
AUTH_USER_MODEL = 'app01.UserInfo'
4.數據庫遷移
makemigrations
# 同步
migrate
7.總結:
你如果自己寫表替代了auth_user那么
auth模塊的功能還是照常使用,參考的表頁由原來的auth_user變成了UserInfo