I have django 1.3 on the remote server behind Nginx.
If I run django with apache + mod_wsgi, I can watch errors in apache log files. It's ok but I'd like to have in console.
If I run django own development server, I get errors with stacktrace in console only when DEBUG = False. In DEBUG mode console outputs
Exception happened during processing of request from (..., ...)
Traceback (most recent call last):
File "/usr/local/python/lib/python2.7/SocketServer.py", line 284, in _handle_request_noblock
self.process_request(request, client_address)
File "/usr/local/python/lib/python2.7/SocketServer.py", line 310, in process_request
self.finish_request(request, client_address)
File "/usr/local/python/lib/python2.7/SocketServer.py", line 323, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/local/python/lib/python2.7/site-packages/django/core/servers/basehttp.py", line 570, in __init__
BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
File "/usr/local/python/lib/python2.7/SocketServer.py", line 641, in __init__
self.finish()
File "/usr/local/python/lib/python2.7/SocketServer.py", line 694, in finish
self.wfile.flush()
File "/usr/local/python/lib/python2.7/socket.py", line 301, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
I want to figure out why? Why does django just output unnamed Exception? Why does it depend on DEBUG variable.
This errors occurs mostly outside views when I have no access to request object. So I can't catch it in middleware or using logging handler.
UPDATE. I noticed if I request to django server directly I never get Broken pipe. So may the issue occur while Nginx proxy django?
This isn't really an issue with your site, more with the Django devserver: see this Django ticket. To put it bluntly, just ignore it as it is a known error, and won't be fixed.
In that ticket's comments a quite clear explanation is given:
Nginx directive
proxy_intercept_errors off;
(disabled by default) is what I neededHere is a way to prevent the to print the message to stderr. Just monkey patch the
BaseServer.handle_error
function. This is how I do it:I was able to get rid of this by
This stops response buffering of proxied server. This leads to other issues of the back-end application being locked for long if the client is on a extremely slow connection.
To make it conditional for particular requests, use X-Accel-Buffering=no in the response header.
I fixed it. If you use links i.e, anchor tag, inside the page, you have to face the "Borken Pipe" problem. Just use inside the link tag href='#'. Don't leave the href attribute blank. It will avoid that type of error.
I came up with a quick and dirty monkey patch (i don't know if it supresses any useful errors), that gets rid of this annoying error when using "./manage.py runserver" or running LiveServerTestCase tests.
Just insert it anywhere in your code, where you need that: