1. 程式人生 > 其它 >Django---csrf裝飾器,中介軟體思想程式設計,auth認證模組和bbs資料表分析

Django---csrf裝飾器,中介軟體思想程式設計,auth認證模組和bbs資料表分析

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方法裝)
# @method_decorator(csrf_protect,name='post')  # 可以
# @method_decorator(csrf_exempt,name='post')  # 無效
class MyView(views.View):
    # @method_decorator(csrf_protect)  # 可以
    @method_decorator(csrf_exempt)  # 有效
    def dispatch(self, request, *args, **kwargs):
        return super(MyView, self).dispatch(request,*args,**kwargs)

    # @method_decorator(csrf_protect)  # 可以
    # @method_decorator(csrf_exempt)  # 無效
    def post(self,request):
        return HttpResponse('from MyView post')

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


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

常規匯入方式

from ccc import b
from ccc.b import name  # 可以直接導變數資料
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)
module_path1 = 'ccc.b.name'
importlib.import_module(module_path1)  # 不可以 最小匯入單位是模組檔案級別

以傳送提示資訊為需求編寫功能的案例

方式1:封裝成函式

方式2:封裝成配置:

# settings
NOTIFY_FUNC_LIST = [
    'notify.email.Email',
    'notify.msg.Msg',
    'notify.qq.QQ',
    'notify.weixin.WeiXin',
]
# __init__
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作為一個完美主義者的終極框架,當然也會想到使用者的這些痛點。它內建了強大的使用者認證系統--auth,它預設使用 auth_user 表來儲存使用者資料。

django自帶的admin後臺管理使用者登入參考的就是auth_user表。

建立admin後臺管理員使用者
tools---run manage.py task---執行createsuperuser
自動對使用者密碼進行加密處理並儲存

auth模組方法大全

1.驗證使用者名稱和密碼是否正確

auth.authenticate() # 校驗正確返回的是使用者物件 錯誤返回的是None

2.儲存使用者登入狀態

auth.login() # 自動幫你操作session相關

3.獲取當前使用者物件

request.user # 獲取當前登入的使用者物件 或者是 匿名使用者

4.判斷當前使用者是否登入

request.user.is_authenticated()  # 判斷使用者是否登入 返回布林值

5.校驗登入裝飾器

from django.contrib.auth.decorators import login_required
@login_required(login_url='/lg/')  # 區域性配置
@login_required  # 全域性配置
LOGIN_URL = '/lg/'  # 需要在配置檔案中新增配置

6.修改密碼

request.user.check_password() # 自動加密再比對
request.user.set_password()  # 臨時修改密碼
request.user.save()  # 將修改操作同步到資料庫中

7.登出登入

auth.logout(request)

8.註冊使用者

from django.contrib.auth.models import User
User.objects.create_superuser(username='admin',password='123',email='[email protected]')  # 管理員
User.objects.create_user(username='oscar',password='123')  # 普通使用者

auth擴充套件表字段


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

方式2:類繼承(推薦)

# settings
'''告訴auth模組 不再使用auth_user 而是使用自定義的表'''
AUTH_USER_MODEL = 'app01.Users'

# models
from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
    # 編寫AbstractUser類中沒有的欄位 不能衝突!!!
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=32)

注意:

  1. 類繼承之後,需要重新執行資料庫遷移命令,並且庫裡面是第一次操作才可以
  2. auth模組所有的方法都可以直接在自定義模型類上面使用,自動切換參照表

專案開發流程和bbs資料表分析


開發流程

1.需求分析
2.技術選型
3.分組開發
4.提交測試
5.交付上線

我們以後寫專案,一般都是從資料庫設計開始!!!一個好的資料庫設計 會讓我們寫程式碼變得非常的輕鬆。

bbs資料表分析

步驟:

  1. 先確定表
  2. 再確定欄位
  3. 最後確定關係
表名 欄位名
使用者表 繼承AbstractUser
個人站點表 站點名稱、標題、樣式
文章表 標題、簡介、內容、釋出時間
文章分類表 分類名稱
文章標籤表 標籤名稱
文章點贊點踩表 文章、使用者、贊/踩
文章評論表 文章、使用者、評論內容、評論時間