csrf相關裝飾器、基於中介軟體思想編寫專案、auth認證模組
阿新 • • 發佈:2022-05-26
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) fromccc.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: #__init__'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)
NOTIFY_FUNC_LIST = [ 'notify.email.Email', 'notify.msg.Msg', 'notify.qq.QQ', 'notify.weixin.WeiXin', ]settings
# django提供給你快速完成使用者相關功能的模組 使用者相關功能:建立、認證、編輯... # django也配套提供了一張'使用者表' 執行資料庫遷移命令之後預設產生的auth_user # django自帶的admin後臺管理使用者登入參考的就是auth_user表 建立admin後臺管理員使用者:run manage.py task>>:createsuperuser 自動對使用者密碼進行加密處理並儲存
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程式碼
# 方式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模組所有的方法都可以直接在自定義模型類上面使用 自動切換參照表 """