Re. 1: Dnspython ought to put the message into the TSIG exceptions, but it doesn't. We'll fix that. In the meantime, you can work around the issue by doing what handle_wire() in tests/nanonameserver.py does (see dnspython source). Namely, when you get an exception processing a message and want to be able to respond, you can try reparsing in "question-only" mode. This would get you enough to be able to generate a TSIG error, though it wouldn't be quite right, as in the case where you know the key but the signature is bad, you're supposed to sign the response, and you wouldn't be able to do that, not knowing what the key was.
(Nanonameserver is a good starting point for how to do a server using dnspython, but it's mostly for testing purposes and so is not complete.)
Re. 2: I'm not sure what you're asking here, in particular what you mean by "zone information". Generally a server would look at the question section directly and not use find_rrset(). E.g. if you have done request = dns.message.from_wire(...) and the question section is not empty, then
request.question[0] will be your question RRset.
If that's not what you are asking, can you give a more detailed example?
/Bob