2015-07-11 3 views
2

Я получаю много запросов спамботов (запросы с реферером как спам-сайт). Как отклонить запрос досрочно с помощью process_request на промежуточном программном обеспечении, чтобы django просто не отвечал на запросы, сделанные от конкретного реферера?Как отклонить запрос досрочно с помощью django?

+6

Я думаю, что лучшим вариантом было бы отбить такие запросы на уровне [веб-сервера] (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 запроса относится к конкретному источнику.

Он должен вернуть либо None, либо объект HttpResponse. Если он вернет None, Django продолжит обработку этого запроса, выполнив любые другие process_request() middlewares, затем 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 

Добавьте межплатформенное к MIDDLEWARE_CLASSES в файле settings.py.

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

Примечание: Здесь RejectSpambotRequestsMiddleware будет работать в конце, как Django применяет промежуточное программное обеспечение в порядке, она определена в MIDDLEWARE_CLASSES, сверху вниз. Вы можете изменить порядок MIDDLEWARE_CLASSES в соответствии с вашими потребностями.

Смежные вопросы