1. 程式人生 > 其它 >csrf相關裝飾器、基於中介軟體思想編寫專案、auth認證模組

csrf相關裝飾器、基於中介軟體思想編寫專案、auth認證模組

csrf相關裝飾器

from django.views.decorators.csrf import csrf_exempt,csrf_protect
"""
csrf_exempt 
    忽略csrf校驗
csrf_protect
    開啟csrf校驗
"""
1.針對FBV
@csrf_protect\@csrf_exempt
def login(request):
    return render(request,'login.html')
2.針對CBV
csrf_protect 三種CBV新增裝飾器的方式都可以
csrf_exempt  只有一種方式可以生效(給重寫的dispatch方法裝)

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

# importlib模組
    可以通過字串的形式匯入模組
# 常規匯入方式
# 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)

from
ccc.b import name # 可以直接導變數資料 import importlib module_path = 'ccc.b.name' importlib.import_module(module_path) # 不可以 最小匯入單位是模組檔案級別 '''以傳送提示資訊為需求 編寫功能''' 方式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)
__init__
NOTIFY_FUNC_LIST = [
    'notify.email.Email',
    'notify.msg.Msg',
    'notify.qq.QQ',
    'notify.weixin.WeiXin',
]
settings

auth認證模組

# django提供給你快速完成使用者相關功能的模組
    使用者相關功能:建立、認證、編輯...
# django也配套提供了一張'使用者表'
    執行資料庫遷移命令之後預設產生的auth_user
# django自帶的admin後臺管理使用者登入參考的就是auth_user表
    建立admin後臺管理員使用者:run manage.py task>>:createsuperuser
  自動對使用者密碼進行加密處理並儲存

auth模組方法大全

from django.contrib import auth
# 1.驗證使用者名稱和密碼是否正確
    auth.authenticate()
# 2.儲存使用者登入狀態
    auth.login()
# 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()
  User.objects.create_suser()
from django.shortcuts import render, HttpResponse, redirect

# Create your views here.

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

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



from django import views
from django.utils.decorators import method_decorator


# @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 post(self, request):
        return HttpResponse('My_view')

    # @method_decorator(csrf_protect) # 可以
    @method_decorator(csrf_exempt) # 可以
    def dispatch(self, request, *args, **kwargs):
        return super(Myview, self).dispatch(request, *args, **kwargs)


from django.contrib import auth
def lg(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        res = auth.authenticate(request, username=username, password=password)
        if res:
            auth.login(request, res)
            return HttpResponse('登陸成功')
    return render(request, 'lg.html')


def get_user(request):
    print(request.user)
    if request.user.is_authenticated():
        print(request.user.username)
        print(request.user.password)
        print(request.user.last_login)
    return HttpResponse('檢視當前使用者是否登入')

from django.contrib.auth.decorators import login_required

@login_required
def func(request):
    return HttpResponse('func')

@login_required
def home(request):
    return HttpResponse('home')

@login_required
def index(request):
    return HttpResponse('index')

@login_required
def set_pwd(request):
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        is_right = request.user.check_password(old_password)
        if is_right:
            request.user.set_password(new_password)
            request.user.save()
            return HttpResponse('修改成功')

    return render(request, 'set_pwd.html', locals())



@login_required
def logout(request):
    auth.logout(request)
    return HttpResponse('登出')

from django.contrib.auth.models import User
def register(request):
    if request.method == 'POST':
        username = request.POST.get('user')
        password = request.POST.get('pwd')
        res = auth.authenticate(request, username=username)
        if res:
            User.objects.create_user(username=username, password=password)
            return HttpResponse('註冊成功')
        else:
            return HttpResponse('已存在')
    return render(request, 'register.html')
View程式碼

auth擴充套件表字段

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

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