Form 驗證css
密碼調用md5 加密存儲html
form.add_error("字段名", "錯誤信息") 自定義錯誤信息python
裝飾器實現 用戶認證django
中間件實現 用戶認證session
中間件顧名思義,是介於request與response處理之間的一道處理過程,相對比較輕量級,而且在全局上改變django的輸入與輸出。由於改變的是全局,因此須要謹慎實用,用很差會影響到性能。
當用戶發起請求的時候會依次通過全部的的中間件,這個時候的請求時process_request,最後到達views的函數中,views函數處理後,在依次穿過中間件,這個時候是process_response,最後返回給請求者。
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
本身定義一箇中間件,寫一個類,可是必須繼承MiddlewareMixin
中間件分爲五種方法:app
process_request(self,request) ***** 用於請求時過濾 process_response(self, request, response) ***** 用於相應時過濾 必須有返回值 process_view(self, request, callback, callback_args, callback_kwargs) *** 在執行完全部的process_request 後在回到 起點執行process_view ,而後在執行 視圖函數 process_exception(self, request, exception) *** 對異常信息捕捉 process_template_response(self,request,response) * 視圖函數返回的對象中間有render方法,就會被觸發
1.md.py內容中間件值函數
from django.conf import settings from django.shortcuts import redirect # 該 MiddlewareMixin 類爲默認繼承類,在Django 1.10 以後須要該類的繼承,1.7-1.8 無需該類繼承 class MiddlewareMixin(object): def __init__(self, get_response=None): self.get_response = get_response super(MiddlewareMixin, self).__init__() def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) if not response: response = self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response class M1(MiddlewareMixin): # process_request 用於請求時過濾 判斷有沒有 USER_SESSION_KEY def process_request(self, request, *args, **kwargs): # path_info 獲取當前URL 的路徑值,不帶參數的路徑 # 若是Url 爲 login 就返回一個None 讓請求繼續 if request.path_info == "/login/": return None else: user_info = request.session.get(settings.USER_SESSION_KEY) if not user_info: return redirect("/login/") # 若是頁面出現錯誤,將請求返回給/index/頁面(能夠將錯誤信息記錄日誌) def process_exception(self,request,exception): print("=========",exception) return redirect("/index/") # 用於相應時過濾 必須有返回值 def process_response(self, request, response): print("m1.process_response") return response
2.在settings.py中引用該中間件工具
# 中間件配置 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', "middlwares.md.M1", # 指定自定義中間件 位置 ] # SESSION 的別名 USER_SESSION_KEY = "user_info_key"
3.在views.py 中設置值性能
from django.shortcuts import render, redirect, HttpResponse # Create your views here. from app01.forms import LoginForm from app01 import models from django.conf import settings # 用戶自定義 + 內置的 settings 配置文件 from utils.md5 import md5 # utils 爲自定義工具 包 def login(request): if request.method == "GET": form = LoginForm() return render(request, "login.html", {"form": form}) else: # 將接收到的數據,傳給LoginForm()類 經過form 驗證; form = LoginForm(request.POST) # 經過 form 驗證後,form 爲True if form.is_valid(): # 經過form驗證的數據 存放在 cleaned_data 中 # form.cleaned_data form.cleaned_data["password"] = md5(form.cleaned_data["password"]) # 經過 **form.cleaned_data 能夠將 數據依照字典形式獲取 filter({"username":zhangsan,"password":1234}) userinfo = models.UserInfo.objects.filter(**form.cleaned_data).first() # 拿取第一個對象值 # 若是userinfo 中有數據,即表示驗證成功 if userinfo: # 將 用戶信息 放置到 session 中 request.session[settings.USER_SESSION_KEY] = {"id": userinfo.pk, "username": userinfo.username} # 重定向 頁面 return redirect("/index/") else: # 用戶驗證失敗,password 錯誤信息顯示在哪一個 字段上 form.add_error("password", "用戶名或密碼錯誤") # 存放錯誤信息 form.errors # 將 form 清洗過的 數據直接返回給 html 模板 return render(request, "login.html", {"form": form}) def index(request): return HttpResponse("驗證成功!") # return render(request, "index.html")
4.定義工具模塊md5.pyui
import hashlib def md5(text): m = hashlib.md5() m.update(text.encode("utf-8")) return m.hexdigest() if __name__ == '__main__': text = "zhangsan" print(md5(text))
5.forms.py 驗證配置
from django.forms import Form # widgets 表示插件 from django.forms import widgets # fields 表示全部的字段 from django.forms import fields class LoginForm(Form): username = fields.CharField( label="用戶名", required=True, # 表示不能爲空,默認不可爲空 error_messages={ # 錯誤信息 依照中文形式顯示 "required": "用戶名不能爲空", # required 爲真是錯誤信息 }, # 插件類型TextInput(attrs={"class": "自定義屬性 多個依照空格分隔 form-control 爲bootcss屬性"}) widget=widgets.TextInput(attrs={"class": "form-control xxx aaa"}) ) password = fields.CharField( label="密碼", required=True, # 表示不能爲空,默認不可爲空 error_messages={ # 錯誤信息 依照中文形式顯示 "required": "密碼不能爲空", # required 爲真是錯誤信息 }, widget=widgets.PasswordInput(attrs={"class": "form-control"}) )