欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

千鋒扣丁學(xué)堂Python培訓(xùn)之django基于中間件實(shí)現(xiàn)限制ip頻繁訪問過程詳解

2019-07-30 14:20:08 1271瀏覽

今天千鋒扣丁學(xué)堂Python培訓(xùn)老師給大家分享一篇關(guān)于django基于中間件實(shí)現(xiàn)限制ip頻繁訪問過程詳解,首先瀏覽器前端傳來的請求,必須通過中間件,才能到后面路由,視圖函數(shù),所以我們在中間件那里做一層處理,我們還需要知道是哪個(gè)ip,在什么時(shí)候,請求了幾次,這些數(shù)據(jù)是要知道,并且記錄下來,所以我創(chuàng)建了一個(gè)表,來存放這些信息數(shù)據(jù),下面我們一起來看一下吧。



models文件:

class Host_info(models.Model):
 host = models.CharField(max_length=32)
 count = models.IntegerField()
 start_time = models.DateTimeField()
 is_lock = models.CharField(max_length=32,default='2')

host:記錄主機(jī)ip

count:記錄請求的次數(shù)

start_time:記錄請求的時(shí)間

is_lock:記錄該ip的狀態(tài),默認(rèn)為22代表未鎖定,1代表鎖定

接下來就是自定義中間件了,并寫process_request方法,我們只對請求做處理,我先貼代碼,最后寫我遇到的一些問題

mymiddleware文件(我自定義的中間件):

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render, HttpResponse
from app01 import models
import datetime
class Md1(MiddlewareMixin):
 def process_request(self, request):
  url = request.path
  if url.startswith('/favicon.ico'):
   return HttpResponse
class Md2(MiddlewareMixin):
 def process_request(self, request):
  now_time = datetime.datetime.now()
  host = request.META.get('REMOTE_ADDR')
  ret = models.Host_info.objects.filter(host=host).first()
  if ret:
   aa = now_time - ret.start_time
   if aa.seconds >= 60:
    ret.count = 1
    ret.start_time = now_time
    ret.is_lock = '2'
    ret.save()
    return None
   if aa.seconds < 60 and ret.is_lock == '1':
    return HttpResponse('登陸次數(shù)頻繁,一分鐘后再試')
 
   if ret.count < 4 and ret.is_lock == '2':
    if ret.count == 2:
     ret.is_lock = '1'
     ret.count = 0
     ret.save()
    else:
     ret.count += 1
     ret.start_time = now_time
     ret.save()
    return None
  else:
   models.Host_info.objects.create(host=host, start_time=now_time, count=1)
   return None

settings文件:

添加兩行代碼在MIDDLEWARE列表中:

'mymiddleware.Md1',
'mymiddleware.Md2',

并配置下面兩句,原因后面會(huì)說

TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False

遇到兩個(gè)問題:

問題一:就是datetime,也就是時(shí)間分區(qū)問題,因?yàn)槲覕?shù)據(jù)表中需要保存到該ip訪問的時(shí)間,存的時(shí)候存的是datetime對象,但是我從數(shù)據(jù)庫中取出來這個(gè)時(shí)間,進(jìn)行比較會(huì)報(bào)出錯(cuò)誤,錯(cuò)誤類型忘記了,我就打印了從數(shù)據(jù)庫中取出的時(shí)間數(shù)據(jù),發(fā)現(xiàn),這個(gè)時(shí)間帶著時(shí)區(qū),而我datetime.datetime.now()的時(shí)間是本機(jī)時(shí)間,根本不能相減,相比較。

網(wǎng)上收索才知道django默認(rèn)是有時(shí)間分區(qū)的,TIME_ZONE='UTC',USE_TZ=True,這兩句。

解決方式:在setting文件中將上面那兩句修改為TIME_ZONE='Asia/Shanghai',USE_TZ=False。這樣就解決了。

在django中但凡出現(xiàn)時(shí)間的話,這個(gè)地方需要注意下。

問題二:額額這個(gè)問題,我在寫的時(shí)候出現(xiàn)過,但是今天測試沒那個(gè)問題,反正寫上吧。我之前的錯(cuò)誤就是我發(fā)出一個(gè)請求,

首先:第一個(gè)請求就是訪問到url,接著第二個(gè)請求就是發(fā)出favicon.ico這種類似的,請求ico這個(gè)。以這個(gè)情況來說問題吧,

你雖然在瀏覽器只發(fā)出一個(gè)請求,但是響應(yīng)過來的網(wǎng)頁,里面可以還有其他請求,所以這中情況需要考慮到。

解決方式:我在對用戶ip做限制之前,加一個(gè)中間件,過濾掉其它的請求。,也就是上面的MD1。

## 代碼其實(shí)很簡單,主要是邏輯處理,你是怎么想就用代碼去實(shí)現(xiàn)。
## 對了,這里的數(shù)據(jù)存儲,你可以定義一個(gè)變量去存放存這些信息(也就是我數(shù)據(jù)表存放的這個(gè))
## 這里唯一值得注意的就是時(shí)間了,你要很清楚知道時(shí)區(qū)這個(gè)問題。

補(bǔ)充一點(diǎn),datetime的一個(gè)用法

例子中我用到datetime對象之間相減,取差多少秒,也就是這句

aa = now_time - ret.start_time
aa.seconds # 取到相差多少秒

這里的aa是datetime.timedelta類型

以上就是關(guān)于千鋒扣丁學(xué)堂Python培訓(xùn)之django基于中間件實(shí)現(xiàn)限制ip頻繁訪問過程詳解的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,最后想要了解更多關(guān)于Python和人工智能方面內(nèi)容的小伙伴,請關(guān)注扣丁學(xué)堂Python培訓(xùn)官網(wǎng)、微信等平臺,扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育平臺為您提供權(quán)威的Python開發(fā)環(huán)境搭建視頻,Python培訓(xùn)后的前景無限,行業(yè)薪資和未來的發(fā)展會(huì)越來越好的,扣丁學(xué)堂老師精心推出的Python視頻教程定能讓你快速掌握Python從入門到精通開發(fā)實(shí)戰(zhàn)技能??鄱W(xué)堂Python技術(shù)交流群:279521237。


扣丁學(xué)堂微信公眾號                          Python全棧開發(fā)爬蟲人工智能機(jī)器學(xué)習(xí)數(shù)據(jù)分析免費(fèi)公開課直播間


      【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】         【掃碼進(jìn)入Python全棧開發(fā)免費(fèi)公開課】



查看更多關(guān)于"Python開發(fā)資訊"的相關(guān)文章>

標(biāo)簽: Python培訓(xùn) Python視頻教程 Python在線視頻 Python學(xué)習(xí)視頻 Python培訓(xùn)班

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費(fèi)咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部