DNSpython has two interfaces to the resolver, a high-level one (you create a dns.resolver.Resolver() object and then call its query() method) and a low-level one (create a message with dns.message.make_query() then call dns.query.udp(the_message). The first one is easier to use but some things cannot be done (for instance, it stupidly retries when the resolver returns SERVFAIL, until the timeout). The second interface provides a better control. DNS Looking Glass uses the high-level interface.
May be we should modify DNS Looking Glass to switch to the low-level one? Some things like parsing resolv.conf or handling retries and timeouts would have to be done by us, in that case.
Done in the LLI branch and merged to master on 23rd December 2012.