Допустим xml:
<?xml version="1.0" encoding="utf-8"?>
<main version="1">
<sub number="1">first</sub>
<sub number="2">second</sub>
</main>
Код сервера с неверным обработчиком:
from io import BytesIO from xml.etree import ElementTree as ET from tornado.ioloop import IOLoop from tornado.httpserver import HTTPServer from tornado.web import * from concurrent.futures import ProcessPoolExecutor class XpathHandler(RequestHandler): @asynchronous def get(self): #http://127.0.0.1:8888/xpath/?file=xml_file.orx&xpath=.// file_name = self.get_argument('file') xpath = self.get_argument('xpath') with ProcessPoolExecutor(max_workers=1) as executor: future = executor.submit(XpathHandler.parse_xml, file_name, xpath) future.add_done_callback(self.callback) @staticmethod def parse_xml(self, file_name, xpath): output = BytesIO() tree = ET.parse(file_name) root = tree.getroot() finded_elements = root.findall(xpath) resulted_element = ET.Element('result') resulted_element.extend(finded_elements) tree._setroot(resulted_element) tree.write(output, encoding='utf-8', xml_declaration=True) result = output.getvalue().decode() output.close() return result def callback(self, future): self.write(str(future.result())) self.finish() if __name__ == '__main__': application = Application([ (r"/xpath/", XpathHandler)], debug=True, ) http_server = HTTPServer(application) http_server.listen(8888, 'localhost') IOLoop.instance().start()
http://127.0.0.1:8888/xpath/?file=light_xml.xml&xpath=.//
Помогите сделать это в абстракциях торнадо , пофиг как, хоть на сопрограммах, на объектах Task, Callback, Wait. Упёрся в то, что в документации очень плохо описана работа с этими объектами, тупо описание объектов. К тому же я в асинхронности начинающий и уже сжег кучу нервов =)
Буду рад любому совету. Принципиально python 3.3, tornado, асинхронность, Windows.