我必须创建一个侦听服务器,它将从网络传感器接收HTTP POST / XML警报流量并解析收到的XML。作为Python的初学者,并且很难理解课程,我想获得建议,如果我实现了我想要正确实现的类和功能,并且如果有更好的或"更多Pythonic"这样做的方式。我强迫自己使用课程,希望我能更好地掌握这个概念,我知道我可以使用常规函数。
到目前为止的脚本:
我使用BaseHTTPServer和SocketServer模块创建线程HTTP服务器,使用xml.dom.minidom类来解析XML数据。到目前为止,我已经设置了两个类 - 一个用于设置线程(ThreadedHTTPServer),另一个用于设置其他所有类(ThreadedHTTPRequestHandler)。 "其他一切" class当前正在管理会话和操作数据。我认为我需要三个类,将数据操作分解为第三个类,而将第二个类仅用于管理入站连接。这是正确的吗?如何将ThreadedHTTPRequestHandler类的连接数据传递给将解析和操作XML数据的新类?
对这位新手的任何帮助将不胜感激。代码如下,目前正在运行。它此时所做的只是接受传入的连接并打印我感兴趣的特定标签的XML。
import cgi
from xml.dom.minidom import parseString
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from SocketServer import ThreadingMixIn
# Server settings
HOST = ''
PORT = 5000
BUFF = 2048
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
"""
This class sets up multi-threading for the server
"""
pass
class ThreadedHTTPRequestHandler(BaseHTTPRequestHandler):
'''
This class is the overall request handler.
This class contains functions to manage client connections and manipulate data.
'''
def do_POST(self):
'''
This method handles the inbound HTTP POST data
'''
print 'Connection from: ', self.client_address[0], self.client_address[1]
ctype = self.headers.getheader('content-type')
content_len = int(self.headers.getheader('content-length'))
if ctype == 'multipart/form-data':
self.post_body = cgi.parse_multipart(self.rfile)
elif ctype == 'application/x-www-form-urlencoded':
self.post_body = self.rfile.read(content_len)
else:
self.post_body = ""
self.done(200)
self.handleXML()
def done(self, code):
'''
Send back an HTTP 200 OK and close the connection
'''
try:
self.send_response(code)
self.end_headers()
except:
pass
print 'Connection from: ', self.client_address[0], self.client_address[1], ' closed.'
#class XMLHandler():
def handleXML(self):
'''
This method parses and manipulates the XML alert data
'''
xml_dom = parseString(self.post_body)
xmlTag = xml_dom.getElementsByTagName('malware')[0].toxml()
#print out the xml tag and data in this format: <tag>data</tag>
print xmlTag
if __name__ == "__main__":
try:
server = ThreadedHTTPServer((HOST, PORT), ThreadedHTTPRequestHandler).serve_forever()
print
except KeyboardInterrupt:
pass
答案 0 :(得分:0)
您不一定需要第三节课。你需要的是一个独立的功能,
def handle_xml(post_body):
# work
这样您就不再需要将post_body
存储在ThreadedHTTPRequestHandler
。
类层次结构非常适合某些问题,并且适合大多数问题。如果您不需要,请不要使用它们,它们只会使您的代码复杂化。