Python 如何使用django提前拒绝请求?
我收到了很多垃圾邮件请求(将推荐人作为垃圾邮件站点的请求)。Python 如何使用django提前拒绝请求?,python,django,security,httprequest,django-middleware,Python,Django,Security,Httprequest,Django Middleware,我收到了很多垃圾邮件请求(将推荐人作为垃圾邮件站点的请求)。 如何使用中间件上的process_request提前拒绝请求,使django不响应来自特定参考者的请求?您可以创建一个RejectSpambotRequestsMiddleware类,如果请求的参考者来自特定参考者,该类将拒绝请求 它应该返回None或HttpResponse对象。如果返回None,Django将继续处理此请求,执行任何其他process\u request()中间件,然后执行process\u view()中间件,最
如何使用中间件上的process_request提前拒绝请求,使django不响应来自特定参考者的请求?您可以创建一个
RejectSpambotRequestsMiddleware
类,如果请求的参考者来自特定参考者,该类将拒绝请求
它应该返回None
或HttpResponse
对象。如果返回None
,Django将继续处理此请求,执行任何其他process\u request()
中间件,然后执行process\u view()
中间件,最后执行适当的视图。通常,如果传入请求未通过中间件执行的检查,则会向用户发送403禁止的响应
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\u类中
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
...
...
# your custom middleware here
'my_project.middlewares.RejectSpambotRequestsMiddleware',
)
注意:在这里,拒绝mbotrequestsmiddleware
将在最后运行,因为Django按照中间件类
中定义的顺序自上而下应用中间件。您可以根据需要更改中间件类的顺序。对@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
我认为更好的选择是在第一时间拒绝此类请求。如果请求到达Django,它将占用资源。我不确定这是否是你主要关心的问题,或者你网站上的垃圾邮件是否是,但最好使用防火墙或根据某些规则删除传入请求的东西,以防止它占用可以在其他地方使用的宝贵资源。旁白:这样的垃圾邮件请求的目的是什么?他们认为他们能完成什么?我同意@Pynchia的观点,在可能的最早阶段,也就是在代理或Web服务器级别,甚至在它到达Django之前,这样做是最有效的。。。Django中间件在请求处理中相当晚pipeline@knbk没错。我会考虑的。