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没错。我会考虑的。