On 28 March 2010 06:10, Manlio Perillo <manlio_peri...@libero.it> wrote: > Hi. > > Some time ago, someone reported me that an application embedded in Nginx > with my WSGI module failed to execute, since in my implementation the > wsgi.errors object does not implement the .close method. > > The same object type is used to replace sys.stderr. > > Of course, both trying to close wsgi.errors and sys.stderr means an > application/framework is broken, IMHO.
I'd agree, but there isn't much you can do about people/code not doing the right thing. I had to give up on trying to get people to write portable WSGI code and not arbitrarily try and read from or write to sys.stdin and sys.stdout. It is a similar issue with things like close() and various other methods that sys.stderr may supply. You just have to provide a complete file like object implementation per Python documentation requirements and have it appear that it did what was requested and/or return an appropriate result for your system. > Unfortunately I never got to know what application or framework was > causing the problem. > > Any idea? Looking at code, seems that for Apache/mod_wsgi I will notionally close the log object, which means that if that did this for sys.stderr standin, that any subsequent writes would result in a specific error message to highlight that something wrong was done. FWIW, the full set of methods and attributes I implement to make it properly file like are: static PyMethodDef Log_methods[] = { { "flush", (PyCFunction)Log_flush, METH_VARARGS, 0 }, { "close", (PyCFunction)Log_close, METH_VARARGS, 0 }, { "write", (PyCFunction)Log_write, METH_VARARGS, 0 }, { "writelines", (PyCFunction)Log_writelines, METH_VARARGS, 0 }, #if PY_MAJOR_VERSION >= 3 { "readable", (PyCFunction)Log_readable, METH_VARARGS, 0 }, { "seekable", (PyCFunction)Log_seekable, METH_VARARGS, 0 }, { "writable", (PyCFunction)Log_writable, METH_VARARGS, 0 }, #endif { NULL, NULL} }; static PyGetSetDef Log_getset[] = { { "closed", (getter)Log_closed, NULL, 0 }, #if PY_MAJOR_VERSION < 3 { "softspace", (getter)Log_get_softspace, (setter)Log_set_softspace, 0 }, #else { "encoding", (getter)Log_get_encoding, NULL, 0 }, { "errors", (getter)Log_get_errors, NULL, 0 }, #endif { NULL }, }; Graham _______________________________________________ Web-SIG mailing list Web-SIG@python.org Web SIG: http://www.python.org/sigs/web-sig Unsubscribe: http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com