我是否正确使用类和实现功能?

时间:2014-04-28 12:51:39

标签: python xml class httpserver

我必须创建一个侦听服务器,它将从网络传感器接收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

1 个答案:

答案 0 :(得分:0)

您不一定需要第三节课。你需要的是一个独立的功能,

def handle_xml(post_body):
    # work

这样您就不再需要将post_body存储在ThreadedHTTPRequestHandler

类层次结构非常适合某些问题,并且适合大多数问题。如果您不需要,请不要使用它们,它们只会使您的代码复杂化。