中介軟體版的登入驗證需要依靠session,所以資料庫中要有django_session表。
先建立乙個mysql的資料庫
啟動mysql伺服器: net start mysql
以管理員身份登入: mysql -uroot -p
檢視資料庫: show databases;
建立資料庫: create database db_middle
再去pycharm配置資料庫
databases =}
跟views在同一級的__init__裡配置
設定session
next_url=request.get.get("
next
") #
獲取跳到登入頁面之前的位址
#如果有,就跳轉回登入之前的url
ifnext_url:
return
redirect(next_url)
else
:
return redirect("
/index/")
return render(request,"
login.html")
deflogout(request):
request.session.delete()
#刪除伺服器的session資料,不刪除cookie
return redirect("
/login/
")
templates
login.html
"en">
home.html
"en">"
/logout/
">登出
白名單 black_list=["
/black/
",] #
黑名單def
process_request(self,request):
next_url =request.path_info
print("
path:
",request.path) #
獲取請求路徑資訊
print("
path_info:
",request.path_info) #
路徑資訊 不包含ip和埠、引數
print("
get_full_path:
",request.get_full_path()) #
路徑資訊 + 引數
#黑名單的**愛限制訪問
#白名單的**或者登陸使用者不做限制
#訪問的url在白名單內或者session中有user使用者名稱,則不做阻攔走正常流程
elif next_url in self.white_list or request.session.get("
user"):
return
none
else
:
return redirect("
/login/?next={}
".format(next_url))
再新增乙個中介軟體 限制60秒之內最多嘗試登入3次
#限制60秒 之內最多只能訪問3次
import
time
class
throttle(middlewaremixin):
defprocess_request(self,request):
#獲取訪問記錄
history = request.session.get("
history",)
#獲取當前時間
now =time.time()
#history [ 9:16:30 , 9:16:35, 9:16:40 ] 9:26:50
#history [ 9:16:40 , 9:16:35, 9:16:30 ,] 9:26:50
while history and now - history[-1] > 60: #
取出history列表中的最後乙個
#如果超過一分鐘 就pop刪除最後乙個
你的訪問頻率太快了,你歇一會")
history.insert(0,now)
#把最新的時間資料插入到history的列表的最前端
request.session[
"history
"]=history #
把最近一次登入的記錄新增到session
也可以根據ip做訪問許可權的限制, 效果同上
#某些ip訪問伺服器的頻率過高,進行攔截,比如限制 每 10 秒 不能超過 3次。
#通過ip 也可以限制
import
time
visit_dict={}
class
throttle(middlewaremixin):
defprocess_request(self,request):
#獲取ip
ip = request.meta.get("
remote_addr")
#獲取訪問記錄
history =visit_dict.get(ip,)
#沒有訪問記錄
ifnot
history:
visit_dict[ip]=history
#獲取當前時間
now =time.time()
#history [ 9:16:40 , 9:16:35, 9:16:30 ,] 9:26:50
#new =
#for i in history:
#if now - i > 10:##
#for i in new:
#history.remove(i)
#可以用下面的方法代替以上幾行
訪問頻率太快")
history.insert(0,now)
settings
新增一條自定義中介軟體
Django 中介軟體 登入驗證
django的request請求需要首先經過中介軟體處理,再通過url查詢到對應的views函式進行處理。在settings的middleware classes中 新增設定中介軟體進行啟用,大致原理如下圖所示 在使用django框架進行開發的過程中,遇到乙個問題 要求對覺得多數頁面請求reques...
Django中介軟體(強制登入)
中介軟體 middleware 用於在http請求到達 檢視函式之前 和 檢視函式return之後 django會根據自己的規則在 合適的時機執行中介軟體中相應的方法。常用作view中冗餘功能的抽取,如每個頁面 或某些頁面 在訪問前強制登入。強制登入例項 定義中介軟體 可以新建乙個包 中介軟體中常用...
Django 中介軟體 登入驗證
django的request請求需要首先經過中介軟體處理,再通過url查詢到對應的views函式進行處理。在settings的middleware classes中 新增設定中介軟體進行啟用,大致原理如下圖所示 在使用django框架進行開發的過程中,遇到乙個問題 要求對覺得多數頁面請求reques...