1. 程式人生 > 其它 >今日學習內容總結5.9

今日學習內容總結5.9

今日學習內容總結

csrf相關裝飾器

兩種裝飾器

    1.  @csrf_exempt: 全域性啟用csrf校驗的時候,使用過該裝飾器可以使得區域性不進行校驗

    2. @csrf_protect:全域性禁用csrf校驗的時候,使用該裝飾器可以使得區域性任然進行校驗

兩種裝飾器的使用

      先匯入裝飾器:

from django.views.decorators.csrf import csrf_exempt,csrf_protect

      為cbv新增裝飾器

# @csrf_exempt  # 全域性啟用,csrf_CBV可以不進行校驗
@csrf_protect  # 全域性禁用(也就是註釋掉CSRF校驗的中介軟體),csrf_CBV仍然進行校驗
def csrf_CBV(request):
    if request.method == 'GET':
        return render(request,'csrf_CBV.html')
    elif request.method == "POST":
        from_name = request.POST.get('from_name')
        to_name = request.POST.get('to_name')
        money = request.POST.get('money')
        return HttpResponse(f'{from_name}向{to_name}轉賬{money}元成功')

      針對fbv新增裝飾器

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

基於中介軟體思想編寫專案

      我們之前說過,每個中介軟體其實就是一個類。而基於中介軟體思想編寫專案,其實就是可以通過字串的形式匯入模組。

# 常規匯入方式
    from ccc import b
    print(b)  # <module 'ccc.b' from '/Users/jiboyuan/PycharmProjects/day61_1/ccc/b.py'>
    print(b.name)

# 字串匯入方式
    import importlib
    module_path = 'ccc.b'
    res = importlib.import_module(module_path)
    print(res.name)

# 傳送提示資訊功能示例
方式1:封裝成函式
方式2:封裝成配置
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)

Django值auth模組

前言

      我們在開發一個網頁的時候, 無可避免的需要設計實現網站的使用者系統; 此時我們需要實現包括使用者註冊、使用者登入、使用者認證、登出、修改密碼等功能, 為了節省這個麻煩的過程, Django自帶了強大的使用者認證系統Auth, 它預設使用auth_user表來儲存使用者的資料。

auth模組的使用

      先匯入auth模組

form django.contrib import auth 

      進行資料遷移命令來生成auth_user表

python3 manage.py makemigrations
python3 manage.py migrate

      auth_user表字段

      欄位介紹

欄位 釋義
id ID
password 密碼
last_login 最後登入時間
is_superuser 是否是管理員
username 使用者名稱
first_name
last_name
email 郵箱
is_staff 是否是工作人員
is_active 是否啟用
date_joined 建立時間

常用方法

      authenticated : 登入認證

    1. 作用:提供了使用者認證功能,即驗證使用者名稱以及密碼是否正確

    2. 必須傳入兩個引數 : username & password

    3. 校驗成功返回 True, 校驗失敗返回 None

    4. request 可以不用傳, 預設就是 None
from django.contrib import auth

user_obj = auth.authenticated(request, username=username, password=password)
if user_obj:
    print(user_obj.username)
    print(user_obj.password)
else:
    print('校驗失敗')

      login : 儲存使用者狀態

    1. 作用 : 該函式接收一個HttpRequest物件,以及一個經過認證的 User 物件

    2. 實現一個使用者登入的功能, 本質上會在後端為該使用者生成相關session資料存在session表中

    3. 只要執行了該方法 你就可以在任何地方通過request.user獲取到當前登陸的使用者物件,否則拿到的是一個匿名使用者物件
# 登入成功後呼叫
auth.login(request, user_obj)   # 內部呼叫的就是 request.session['key']=user_obj

      request.user : 獲取當前使用者物件

      auth元件的中間間中做了這樣一個事情,當request請求來時,判斷是否有session,如果有session則會根據session去django_session中找出相應的使用者的資訊,並賦值給request.user屬性,也就是request.user=user是一個User資料物件,否則返回一個匿名的物件給request.user,該物件呼叫所有的方法都返回None

def index(request):
    print(request.user)
# 是一個懶載入資料物件

      is_authenticated : 判斷使用者是否登入

      用來判斷當前請求是否通過了認證

# 檢視類中使用
if not request.user.is_authenticated():
    print('未登入,請先登入')

# 模板中使用
{% if request.user.is_authenticated %}
    {{ request.user.username }} 歡迎回家
{% else %}
    <a href="/auth_login/">請去登入</a>
{% endif %}

      login_required : 登入認證裝飾器

      作用 : 一個裝飾器工具, 用來快捷的給某個檢視新增登入校驗

# 使用方式一 : 直接在檢視函式上新增
@login_required(login_url='/login/')  # 需要指定url(因為它存在預設url)
@login_required  # 全域性配置
def logout_func(request):
    auth.logout(request)
    return redirect("/login/")
    
# 使用方式二 : 在配置檔案中全域性配置
LOGIN_URL = '/login/'

      check_password : 檢驗密碼

    1. 作用 : 提供的一個檢查密碼是否正確的方法, 需要提供當前請求使用者的密碼

    2. 密碼正確返回 True, 否則返回 False
if user.check_password('[你的密碼]'):
    print('ok')

      set_password : 修改密碼

    1.作用 : 提供的一個修改密碼的方法, 接收要設定的新密碼作為引數

    2. 設定完一定要呼叫使用者物件的 save 方法

      logout : 退出登入

    1. 作用 : 該函式接受一個HttpRequest物件,無返回值

    2. 當呼叫該函式時, 當前請求的session資訊會全部清除; 該使用者即使沒有登入, 使用該函式也不會報錯
# 登出當前登入使用者:
auth.logout(request)  # 內部使用的就是 request.session.flush()

      create_user : 建立普通使用者

      作用 : 提供的一個建立新使用者的方法, 需要提供必要引數 username & password等

from django.contrib.auth.models import User

user = User.objects.create_user(username='使用者名稱',password='密碼',email='郵箱',...)

      create_superuser : 建立管理員使用者

      作用 : 提供的一個建立管理員使用者的方法, 需要提供必要引數 username & password & email等

from django.contrib.auth.models import User
user = User.objects.create_superuser(username='使用者名稱',password='密碼',email='郵箱',...)

auth擴充套件表字段

      auth_user 中的欄位有限, 想要在 auth_user 表中新增新的欄位, 我們可以對其進行擴充套件。

擴充套件方式一 : 建立一對一外來鍵關係

      新建一個模型類, 比如要新增 Phone 欄位, 在該模型內中寫入, 並新增 User 的外來鍵欄位

from django.contrib.auth.models import User 
class user_detail(models.Model):
    user=models.OneToOneField(to='User')
    phone=models.CharField(max_length=32)

擴充套件方式二 : 繼承 AbstractUser 類來擴寫 (步驟)

    1. 首先大前提是沒有生成 auth_user 表(也就是沒進行資料庫遷移操作)(有的話需要刪乾淨遷移記錄和表)

    2. 書寫一個類, 並繼承 AbstractUser 類

    3. 在類中可以書寫你需要擴充套件的欄位, 也可以重寫原來的欄位
        class MyAuthUser(AbstractUser):
            username=models.CharField(max_length=12)  # 重寫欄位
            phone=models.CharField(max_length=32)     # 書寫新欄位

    4. 到 setting.py 配置檔案中設定 AUTH_USER_MODEL 引數, 不然報錯
        AUTH_USER_MODEL = "[app名].[類名]"
        AUTH_USER_MODEL = "app01.MyAuthUser"  # 示例

    5. 最後進行資料庫遷移命令
        python3 manage.py makemigrations
        python3 manage.py migrate

如果 auth_user 表已經存在

    1. 先刪庫

    2. 並清空專案中所有的 makemigrations 而來的遷移記錄

    3. 再清空原始碼中admin,auth倆app的 makemigrations 產生的記錄