1. 程式人生 > 其它 >django auth模組

django auth模組

django auth模組

csrf相關裝飾器

# 匯入模組
from django.views.decorators.csrf import csrf_exempt,csrf_protect

# csrf_exempt 
忽略csrf校驗
# csrf_protect
開啟csrf校驗

# 針對FBV
@csrf_protect\@csrf_exempt
def login(request):
    return render(request,'login.html')

# 針對CBV
csrf_protect 三種CBV新增裝飾器的方式都可以
csrf_exempt  只有一種方式可以生效(給重寫的dispatch方法裝)

字串形式匯入模組

# importlib模組
import importlib	
可以通過字串的形式匯入模組

# 常規匯入方式
from ccc import b
# 字串匯入方式
import importlib
module_path = 'ccc.b'
res = importlib.import_module(module_path)
'最小匯入單位是模組檔案級別'

功能的插拔式設計

# 以傳送提示資訊為需求 編寫功能
方式1:封裝成函式
方式2:封裝成配置
    
# 封裝成配置的形式

# settings.py
NOTIFY_FUNC_LIST = [
    'notify.email.Email',
    'notify.msg.Msg',
]
# email.py
class Email(object):
    def __init__(self):
        pass	# 模擬傳送簡訊需要提前準備的操作
    def send(self,msg):
        print('簡訊提示:%s'%msg)


# __init__.py
import settings
import importlib
def send_all(msg):
    # 1.迴圈獲取配置檔案中字串資訊
    for str_path in settings.NOTIFY_FUNC_LIST:  # 'notify.email.Email'
        # 2.切割路徑資訊
        module_path, class_str_name = str_path.rsplit('.', maxsplit=1)  # ['notify.email','Email']
        # 3.根據module_path匯入模組檔案
        module = importlib.import_module(module_path)
        # 4.利用反射獲取模組檔案中對應的類名
        class_name = getattr(module, class_str_name)  # Email  Msg  QQ
        # 5.例項化
        obj = class_name()
        # 6.呼叫傳送訊息的功能
        obj.send(msg)

auth模組

# django提供給你快速完成使用者相關功能的模組
	使用者相關功能:建立、認證、編輯...使用者相關操作
# django也配套提供了一張'使用者表'
	執行資料庫遷移命令之後預設產生的auth_user
# django自帶的admin後臺管理使用者登入參考的就是auth_user表
建立admin後臺管理員使用者:
run manage.py task>>:createsuperuser
python3 manage.py createsuperuser
  自動對使用者密碼進行加密處理並儲存
    
'''django在啟動之後就可以直接訪問admin路由,需要輸入使用者名稱和密碼,資料參考的就是auth_user表,並且還必須是管理員使用者才能進入'''

auth模組方法

比對使用者名稱和密碼是否正確

'比對使用者名稱和密碼是否正確'
# 匯入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)  # 密文

儲存使用者狀態

'儲存使用者狀態 自動操作sesson相關'
auth.login(request,user_obj) 
# 類似於request.session[key] = user_obj
'''執行了該方法 你就可以在任何地方通過request.user獲取到當前登陸的使用者物件'''

# 獲取當前登入使用者
print(request.user)  # 使用者物件   
'''
沒登陸拿到的是匿名使用者 AnonymousUser
自動去django_session裡面查詢對應的使用者物件給你封裝到request.user
'''

# 判斷當前使用者是否登入
print(request.user.is_authenticated())
'''
返回True 則說明使用者登入
返回False 則說明使用者未登入
'''

校驗登入裝飾器

# 匯入模組
from django.contrib.auth.decorators import login_required

# 區域性配置
@login_required(login_url='/lg/') 

# 全域性配置settings內
LOGIN_URL = '/lg/'
@login_required

'''
全域性的好處在於無需重複寫程式碼 但是跳轉的頁面卻很單一
區域性的好處在於不同的檢視函式在使用者沒有登陸的情況下可以跳轉到不同的頁面
'''

修改密碼

# 比對原密碼
check_password 原密碼
# 返回一個布林值
is_right = request.user.check_password(old_password)  
'自動加密比對密碼'

# 判斷原密碼正常為True 原密碼錯誤為False
if is_right:
    # 修改密碼
    request.user.set_password(new_password)  # 添入新密碼(僅僅修改物件的屬性)
    request.user.save()  # 將修改資料同步到資料庫

登出功能

auth.logout(request)  # 類似於 request.session.flush()

註冊功能

# 註冊使用者
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='[email protected]',password=password)

auth擴充套件表字段

# 前提
1.在繼承之前沒有執行過資料庫遷移命令(auth_user沒有被建立)
如果當前庫已經建立了,那麼你就重新換一個庫

2.繼承的類裡面不要覆蓋AbstractUser裡面原有的欄位名
表裡面有的欄位都不要動,只擴充套件額外欄位即可

3.需要在配置檔案中告訴Django你要用MyUser替代auth_user
AUTH_USER_MODEL = 'app01.MyUser' 	# 應用名點表名

# 方式1:編寫一對一表關係(瞭解)

# 方式2:類繼承(推薦)
from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
    # 編寫AbstractUser類中沒有的欄位 不能衝突!!!
    phone = models.BigIntegerField(null=True)
    addr = models.CharField(max_length=32)

# settings.py
AUTH_USER_MODEL ='app01.MyUser'

優化處理

'對模型表進行配置'
# 繼承系統的user表
class UserInfo(AbstractUser):
    mobile = models.CharField(max_length=11, unique=True)

    class Meta:
        # 更改資料庫的表名
        db_table = 'user'
        # 更改後臺顯示的表名
        verbose_name_plural = '系統使用者表'

    def __str__(self):
        return self.username
    
    

    
    
# 通過Admin.py將表註冊到後臺管理頁面
'''admin.py'''

from django.contrib import admin

# Register your models here.
from app01 import models
# 註冊models中的八張表
admin.site.register(models.UserInfo)
admin.site.register(models.Blog)
admin.site.register(models.Article)
admin.site.register(models.Tag)
admin.site.register(models.Category)
admin.site.register(models.Article_Tag)
admin.site.register(models.Comment)
admin.site.register(models.UpAndDown)

# admin註冊自定義User表:密文操作密碼
from django.contrib.auth.admin import UserAdmin
class UserInfo(UserAdmin):
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            # 新增使用者介面可操作的欄位
            'fields': ('username', 'password1', 'password2', 'mobile', 'email', 'is_staff', 'is_active'),
        }),
    )
    list_display = ('username', 'mobile', 'email', 'is_staff', 'is_active')

# 明文操作密碼,admin視覺化新增的使用者密碼都是明文,登入時用的是密文,所以使用者無法登入
# admin.site.register(models.User)
admin.site.register(models.UserInfo, UserInfo)