如何在生产服务器上禁用NoReverseMatch错误电子邮件?

时间:2011-12-03 17:10:05

标签: python django http url exception

今天早上我的收件箱里有大约100封电子邮件告诉我各种页面不存在(我怀疑某些机器人正在寻找安全漏洞)。错误是:

NoReverseMatch: Reverse for 'view_profile' with arguments '('',)' and keyword arguments '{}' not found.

但是当我转到我的生产服务器上的指定URL时,我会得到我的404页面,就像我期望的那样,并且没有发送电子邮件。那么为什么/这些机器人如何生成(我认为是什么)内部服务器错误?我该如何预防呢?

我的view_profile urlpattern定义如下:

url(r'^(?P<id>\d+)$', name="view_profile")

的子模式
RegexURLResolver(r'^contacts/', 'profiles.views.user_profile'),

它的定义与我的其他任何URL模式完全相同,并且它需要传递给它的ID ....所以我不知道它是如何被没有参数击中的。

完整的痕迹:

Traceback (most recent call last):

 File "/home/me/my/website/lib/python2.7/django/core/handlers/base.py", line 150, in get_response
   response = callback(request, **param_dict)

 File "/home/me/my/website/lib/python2.7/django/utils/decorators.py", line 93, in _wrapped_view
   response = view_func(request, *args, **kwargs)

 File "/home/me/my/website/lib/python2.7/django/views/defaults.py", line 19, in page_not_found
   return http.HttpResponseNotFound(t.render(RequestContext(request, {'request_path': request.path})))

 File "/home/me/my/website/lib/python2.7/django/template/base.py", line 123, in render
   return self._render(context)

 File "/home/me/my/website/lib/python2.7/django/template/base.py", line 117, in _render
   return self.nodelist.render(context)

 File "/home/me/my/website/lib/python2.7/django/template/base.py", line 744, in render
   bits.append(self.render_node(node, context))

 File "/home/me/my/website/lib/python2.7/django/template/base.py", line 757, in render_node
   return node.render(context)

 File "/home/me/my/website/lib/python2.7/django/template/loader_tags.py", line 127, in render
   return compiled_parent._render(context)

 File "/home/me/my/website/lib/python2.7/django/template/base.py", line 117, in _render
   return self.nodelist.render(context)

 File "/home/me/my/website/lib/python2.7/django/template/base.py", line 744, in render
   bits.append(self.render_node(node, context))

 File "/home/me/my/website/lib/python2.7/django/template/base.py", line 757, in render_node
   return node.render(context)

 File "/home/me/my/website/lib/python2.7/django/template/defaulttags.py", line 311, in render
   return self.nodelist_true.render(context)

 File "/home/me/my/website/lib/python2.7/django/template/base.py", line 744, in render
   bits.append(self.render_node(node, context))

 File "/home/me/my/website/lib/python2.7/django/template/base.py", line 757, in render_node
   return node.render(context)

 File "/home/me/my/website/lib/python2.7/django/template/defaulttags.py", line 450, in render
   raise e

NoReverseMatch: Reverse for 'view_profile' with arguments '('',)' and keyword arguments '{}' not found.


<WSGIRequest
GET:<QueryDict: {}>,
POST:<QueryDict: {}>,
COOKIES:{'csrftoken': '89867bc39db49a791bb24dce06e26b6f',
 'sessionid': 'd0db456ae01005678d1538b00ae26dd1'},
META:{'CSRF_COOKIE': '89867bc39db49a791bb24dce06e26b6f',
 'DOCUMENT_ROOT': '/usr/local/apache2/htdocs',
 'GATEWAY_INTERFACE': 'CGI/1.1',
 'HTTP_ACCEPT': '*/*',
 'HTTP_CONNECTION': 'close',
 'HTTP_COOKIE': 'csrftoken=89867bc39db49a791bb24dce06e26b6f; sessionid=d0db456ae01005678d1538b00ae26dd1',
 'HTTP_HOST': 'myproject.net',
 'HTTP_USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6; Zango 10.3.75.0)',
 'HTTP_X_FORWARDED_FOR': '39.47.147.220',
 'HTTP_X_FORWARDED_HOST': 'myproject.net',
 'HTTP_X_FORWARDED_SERVER': 'myproject.net',
 'PATH_INFO': u'/web/',
 'PATH_TRANSLATED': '/home/me/my/website/myproject.wsgi/web/',
 'QUERY_STRING': '',
 'REMOTE_ADDR': '127.0.0.1',
 'REMOTE_PORT': '40577',
 'REQUEST_METHOD': 'GET',
 'REQUEST_URI': '/web/',
 'SCRIPT_FILENAME': '/home/me/my/website/myproject.wsgi',
 'SCRIPT_NAME': u'',
 'SERVER_ADDR': '127.0.0.1',
 'SERVER_ADMIN': '[no address given]',
 'SERVER_NAME': 'myproject.net',
 'SERVER_PORT': '80',
 'SERVER_PROTOCOL': 'HTTP/1.0',
 'SERVER_SIGNATURE': '',
 'SERVER_SOFTWARE': 'Apache/2.2.17 (Unix) mod_wsgi/3.3 Python/2.7.1',
 'mod_wsgi.application_group': 'my.server.com|',
 'mod_wsgi.callable_object': 'application',
 'mod_wsgi.handler_script': '',
 'mod_wsgi.input_chunked': '0',
 'mod_wsgi.listener_host': '',
 'mod_wsgi.listener_port': '54084',
 'mod_wsgi.process_group': '',
 'mod_wsgi.request_handler': 'wsgi-script',
 'mod_wsgi.script_reloading': '1',
 'mod_wsgi.version': (3, 3),
 'wsgi.errors': <mod_wsgi.Log object at 0xae05ef8>,
 'wsgi.file_wrapper': <built-in method file_wrapper of mod_wsgi.Adapter object at 0xb18c1d0>,
 'wsgi.input': <mod_wsgi.Input object at 0xae05e58>,
 'wsgi.multiprocess': False,
 'wsgi.multithread': True,
 'wsgi.run_once': False,
 'wsgi.url_scheme': 'http',
 'wsgi.version': (1, 1)}>

重新命名路径以保护无辜者。

3 个答案:

答案 0 :(得分:1)

某处(可能在模板中),您使用空字符串而不是id来解析view_profile。所以找出它为什么会发生并修复它

答案 1 :(得分:1)

可能是机器人只是请求所有可映射的URL(作为网站爬虫),而不是尊重重定向请求或cookie。

答案 2 :(得分:0)

你可能想要一个robots.txt文件来抵御僵尸程序。将其添加到主urls.py文件中。对于开发环境,应在settings.py中将DISALLOW_ROBOTS设置为True。

if settings.DISALLOW_ROBOTS:
    urlpatterns += patterns('',
        (r'^robots\.txt$', lambda r: HttpResponse("User-agent: *\nDisallow: /", mimetype="text/plain")),
    )
else:
    urlpatterns += patterns('',
        (r'^robots\.txt$', lambda r: HttpResponse("User-agent: *\nDisallow: ", mimetype="text/plain")),
    )