亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

django 基于中間件實現(xiàn)限制ip頻繁訪問過程詳解

 更新時間:2019年07月30日 10:58:22   作者:朱春雨  
這篇文章主要介紹了django 基于中間件實現(xiàn)限制ip頻繁訪問過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

額額,標題已經(jīng)很醒目了,通過中間件去實現(xiàn),其他方法也可以實現(xiàn)

瀏覽器前端傳來的請求,必須通過中間件,才能到后面路由,視圖函數(shù),所以我們在中間件那里做一層處理,我們還需要知道是哪個ip,在什么時候,請求了幾次,這些數(shù)據(jù)是要知道,并且記錄下來,所以我創(chuàng)建了一個表,來存放這些信息數(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:記錄主機ip

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

start_time:記錄請求的時間

is_lock:記錄該ip的狀態(tài),默認為2   2代表未鎖定,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',

并配置下面兩句,原因后面會說

TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False

遇到兩個問題:

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

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

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

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

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

首先

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

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

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

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

補充一點,datetime的一個用法

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

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

這里的aa是datetime.timedelta類型

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳細介紹Python的鴨子類型

    詳細介紹Python的鴨子類型

    相信python的開發(fā)者對于python的鴨子類型比較熟悉,鴨子類型在維基百科中的準確定義是‘是動態(tài)類型的一種風格。在這種風格中,一個對象有效的語義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由"當前方法和屬性的集合"決定’。所以這篇文章給大家python的鴨子類型。
    2016-09-09
  • Python項目跨域問題解決方案

    Python項目跨域問題解決方案

    這篇文章主要介紹了Python項目跨域問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Python中的文件和目錄操作實現(xiàn)代碼

    Python中的文件和目錄操作實現(xiàn)代碼

    對于文件和目錄的處理,雖然可以通過操作系統(tǒng)命令來完成,但是Python語言為了便于開發(fā)人員以編程的方式處理相關(guān)工作,提供了許多處理文件和目錄的內(nèi)置函數(shù)。重要的是,這些函數(shù)無論是在Unix、Windows還是Macintosh平臺上,它們的使用方式是完全一致的。
    2011-03-03
  • python可擴展的Blender 3D插件開發(fā)匯總

    python可擴展的Blender 3D插件開發(fā)匯總

    這篇文章主要為大家介紹了python可擴展的Blender 3D插件開發(fā)匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • python 日志 logging模塊詳細解析

    python 日志 logging模塊詳細解析

    這篇文章主要介紹了python 日志 logging模塊 詳細解析,本文通過實例代碼給大家介紹的非常詳細,對大家的工作或?qū)W習具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Python刪除列表中多個元素的四種方法總結(jié)

    Python刪除列表中多個元素的四種方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于Python刪除列表中多個元素的四種方法,在Python中想要刪除列表的某個元素,可以使用本文介紹的方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • python將視頻轉(zhuǎn)換為全字符視頻

    python將視頻轉(zhuǎn)換為全字符視頻

    這篇文章主要為大家詳細介紹了Python將視頻轉(zhuǎn)換為全字符視頻,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • 在Python中字典根據(jù)多項規(guī)則排序的方法

    在Python中字典根據(jù)多項規(guī)則排序的方法

    今天小編就為大家分享一篇在Python中字典根據(jù)多項規(guī)則排序的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python文本情感分類識別基于SVM算法Django框架實現(xiàn)

    Python文本情感分類識別基于SVM算法Django框架實現(xiàn)

    這篇文章主要為大家介紹了Python文本情感分類識別基于SVM算法Django框架實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Python使用random模塊生成隨機數(shù)操作實例詳解

    Python使用random模塊生成隨機數(shù)操作實例詳解

    這篇文章主要介紹了Python使用random模塊生成隨機數(shù)操作,結(jié)合具體實例形式詳細分析了random模塊生成隨機數(shù)的各種常用技巧與相關(guān)操作注意事項,需要的朋友可以參考下
    2019-09-09

最新評論