今日學習內容總結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 | 名 |
郵箱 | |
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 產生的記錄