Auth模塊
我們在創建好一個Django項目后執行數據庫遷移命令會自動生成很多表????????
其中有auth_user等表
Django在啟動之后就可以直接訪問admin路由,需要輸入用戶名和密碼,數據參考的就是auth_user表,并且必須是管理員才能進入
依賴于auth_user表完成用戶相關的所有功能
創建超級用戶(管理員)
python manage.py createsuperuser
?比對密碼和用戶名是否正確
括號內必須同時傳入用戶名和密碼
user_obj = auth.authenticate(request, username=username, password=password)保存用戶狀態
auth.login(request, user_obj) # 類似于request.session[key]=user_obj # 只要執行了該方法,你就可以在任何地方通過request.user獲取到當前登錄的對象判斷用戶當前是否登錄
request.user.is_authenticated()獲取當前登錄用戶
request.user校驗用戶是否登錄裝飾器
from django.contrib.auth.decorators import login_required@login_required(login_url='/login/') # 局部配置:用戶沒有登錄跳轉到login_url后面指定的網址#全局配置 LOGIN_URL='/login/'?比對密碼
request.user.check_password(old_password) # 返回bool修改密碼
# 設置新密碼 request.user.set_password(new_password) # 僅僅修改對象的屬性 # 操作數據庫 request.user.save()注銷
auth.logout(request)注冊
User.objects.create_user(username=username,password=passwordfrom django.contrib.auth.models import User
urls.py
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [path('admin/', admin.site.urls),#登錄功能path('login/', views.login),#判斷用戶是否登錄path('home/', views.home),#修改密碼path('set_password/',views.set_password),#注銷功能path('logout/',views.logout),#注冊功能path('reg/',views.reg)
]
views.py
from django.shortcuts import render, redirect, HttpResponse
from django.contrib import auth# 使用auth模塊要用就用全套
def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')# 去用戶表中校驗數據# 1.表如何獲取# 2.密碼如何比對user_obj = auth.authenticate(request, username=username, password=password)if user_obj:# 保存用戶狀態auth.login(request, user_obj) # 類似于request.session[key]=user_obj# 只要執行了該方法,你就可以在任何地方通過request.user獲取到當前登錄的對象return redirect('/home/')'''1.自動查找auth_user標簽2.自動給密碼加密再比對該方法注意事項括號內必須同時傳入用戶名和密碼不能只傳用戶名'''return render(request, 'login.html')from django.contrib.auth.decorators import login_required'''
1.如果全局也配置了,優先級 局部>全局
2.全局配置不需重復寫代碼,但是跳轉單一。局部配置好處在于不同的視圖函數在用戶沒有登錄的情況下可以跳到不同頁面
'''@login_required(login_url='/login/') # 局部配置:用戶沒有登錄跳轉到login_url后面指定的網址
def home(request):print(request.user) # 用戶對象 如果django_session表中沒有數據就拿到AnonymousUser匿名用戶# print(request.user.is_authenticated()) #匿名用戶返回False,用來判斷當前用戶是否登錄# 自動去django_session表中查看用戶對象給你封裝到request.user中return HttpResponse('ok')@login_required(login_url='/login/')
def set_password(request):if request.method == 'POST':username = request.POST.get('username')old_password = request.POST.get('old_password')new_password = request.POST.get('new_password')# 對比新舊密碼是否一致if old_password == new_password:# 校驗老密碼is_right = request.user.check_password(old_password) # 返回boolif is_right:# 設置新密碼request.user.set_password(new_password) # 僅僅修改對象的屬性# 操作數據庫request.user.save()return render(request, 'set_password.html', locals())
@login_required
def logout(request):auth.logout(request)return redirect('/login/')
from django.contrib.auth.models import User
def reg(request):if request.method=='POST':username = request.POST.get('username')password = request.POST.get('password')#操作auth_user表寫入數據#User.objects.create() 不能用create,密碼沒有加密處理#創建普通用戶User.objects.create_user(username=username,password=password)return render(request,'reg.html')
auth模塊表擴展???????
models.py??
from django.db import models
from django.contrib.auth.models import User,AbstractUser
# Create your models here.
class UserInfo(AbstractUser):'''如果繼承了AbstractUser那么在執行數據庫遷移命令的時候auth_user就不會被創建出來了而UserInfo表中會出現auth_user所有的字段 外加自己擴展的字段這樣你能直接點擊你自己的表更加快速的完成操作和擴展前提:1.在繼承之前沒有執行過數據庫遷移命令auth_user沒有被創建,如果當前庫已經創建了那么就重新換個庫2.繼承的類里面不要覆蓋AbstractUser里面的字段名表里面所有的字段都不要動,只要擴展字段即可3.需要在配置文件中告訴Django你要用UserInfo代替auth_userAUTH_USER_MODEL='app01.UserInfo'應用名.表名'''phone=models.BigIntegerField()
#替換了auth_user表,auth模塊還是正常使用,參考的表頁從原來的auth_user變成了UserInfo