Django and lxml¶
Yesterday evening already, after the changes on migrate were finished and a full dump from a 1.4.3 database sucessfully loaded into 1.4.4, I noticed that I couldn’t see the result because the server process locked when a web request cam in.
Today it continued to lock.
I fiddled with the Apache configuration. After 4 hours I believed that the following was the cause of the problem:
One of the first steps when a Django process starts up is to
instantiate once each of the classes listed in
At that moment it is “not yet allowed” to trigger
is defined) did exactly this.
It called, at the module level,
resolve_model on the
But it turned out that this was just another detail which didn’t lead to a normal error message because of the freeze.
lino.utils.xmlgen caused the freeze:
if self.xsd_filename: self.xsd_tree = etree.parse(self.xsd_filename) if self.xsd_tree is not None: if targetNamespace is None: root = self.xsd_tree.getroot() targetNamespace = str(root.get('targetNamespace')) if validator is None: validator = etree.XMLSchema(self.xsd_tree) # LOCK
The process never returned when trying to instantiate an etree.XMLSchema.
After 8 hours I found the following post, which finally explains into what mousetrap I had stepped: Django, lxml, WSGI, and Python sub-interpreter magic (posted Fri, 07/30/2010 - 18:21 by branker).
The reason for the freeze was an incompatibility between mod_wsgi and lxml,
and the solution was indeed to add a line
to Apache’s configuration. More explanations