2015-07-11 156 views
2

我收到了很多spambot請求(將referrer作爲垃圾網站的請求)。 如何用中間件上的process_request過早拒絕請求,這樣django根本不會響應從特定引用者發出的請求?如何用django過早拒絕請求?

+6

我認爲更好的選擇是在[web服務器級別]上阻止這樣的請求(http://serverfault.com/questions/289785/where-to-find-and-how-to-block-blacklisted- ips-and-proxies) – Pynchia

+1

如果請求到達Django,它將佔用資源。我不確定這是您主要關注的問題,還是您的網站上存在垃圾郵件,但使用防火牆或根據某些規則丟棄收到的請求是一個好主意,以防止它佔用可以在別處使用的寶貴資源。 – knbk

+0

側面問題:這種垃圾郵件請求的目的是什麼?他們認爲他們會完成什麼? – skaz

回答

8

您可以創建RejectSpambotRequestsMiddleware類,如果請求的referer來自特定的引薦來源,該類將拒絕請求。

它應返回NoneHttpResponse對象。如果返回None,則Django將繼續處理此請求,執行任何其他process_request()中間件,然後,process_view()中間件,最後執行相應的視圖。通常,如果傳入請求未能通過中間件執行檢查,則會向用戶發送403 Forbidden響應。

from django.http import HttpResponseForbidden  

class RejectSpambotRequestsMiddleware(object): 

    def process_request(self, request): 
     referer = request.META.get('HTTP_REFERER') 
     if referer == 'spambot_site_referer': 
      return HttpResponseForbidden() # reject the request and return 403 forbidden response 

     return # return None in case of a valid request 

然後在你的settings.py文件添加中間件到MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    ... 
    ... 
    # your custom middleware here 
    'my_project.middlewares.RejectSpambotRequestsMiddleware', 
) 

注:這裏,RejectSpambotRequestsMiddleware將在年底爲Django的它在MIDDLEWARE_CLASSES定義的順序,自上而下的應用中間件運行。您可以根據需要更改MIDDLEWARE_CLASSES的順序。