我收到了很多spambot请求(请求将referrer作为垃圾网站)。 如何在中间件上使用process_request过早拒绝请求,以便django不响应特定引荐来源的请求?
答案 0 :(得分:9)
如果请求的RejectSpambotRequestsMiddleware
来自特定的引荐来源,您可以创建referer
类来拒绝请求。
它应返回None
或HttpResponse
对象。如果返回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
然后将中间件添加到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
的顺序。
答案 1 :(得分:0)
对@Rahul Gupta的答案进行了一些修改。 将引荐来源网址与黑名单进行比较。
class RejectSpambotRequestsMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
self.blacklist = ['bot1.com', 'bot2.com']
def __call__(self, request):
referer = request.META.get('HTTP_REFERER')
response = self.get_response(request)
if not referer:
return response
for bad in self.blacklist:
if bad in referer:
return HttpResponseForbidden()
return response