代码之家  ›  专栏  ›  技术社区  ›  pistacchio

Python:如何从BaseHTTPRequestHandler HTTP POST处理程序获取键/值对?

  •  43
  • pistacchio  · 技术社区  · 15 年前

    给定最简单的HTTP服务器,如何在BaseHTTPRequestHandler中获取post变量?

    from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
    
    class Handler(BaseHTTPRequestHandler):
        def do_POST(self):
            # post variables?!
    
    server = HTTPServer(('', 4444), Handler)
    server.serve_forever()
    
    # test with:
    # curl -d "param1=value1&param2=value2" http://localhost:4444
    

    我只想得到param1和param2的值。谢谢!

    2 回复  |  直到 7 年前
        1
  •  58
  •   adw    15 年前
    def do_POST(self):
        ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
        if ctype == 'multipart/form-data':
            postvars = cgi.parse_multipart(self.rfile, pdict)
        elif ctype == 'application/x-www-form-urlencoded':
            length = int(self.headers.getheader('content-length'))
            postvars = cgi.parse_qs(self.rfile.read(length), keep_blank_values=1)
        else:
            postvars = {}
        ...
    
        2
  •  29
  •   d33tah    10 年前

    我试图编辑这篇文章,但被拒绝了,所以我的这段代码版本应该适用于Python2.7和3.2:

    from sys import version as python_version
    from cgi import parse_header, parse_multipart
    
    if python_version.startswith('3'):
        from urllib.parse import parse_qs
        from http.server import BaseHTTPRequestHandler
    else:
        from urlparse import parse_qs
        from BaseHTTPServer import BaseHTTPRequestHandler
    
    class RequestHandler(BaseHTTPRequestHandler):
    
        ...
    
        def parse_POST(self):
            ctype, pdict = parse_header(self.headers['content-type'])
            if ctype == 'multipart/form-data':
                postvars = parse_multipart(self.rfile, pdict)
            elif ctype == 'application/x-www-form-urlencoded':
                length = int(self.headers['content-length'])
                postvars = parse_qs(
                        self.rfile.read(length), 
                        keep_blank_values=1)
            else:
                postvars = {}
            return postvars
    
        def do_POST(self):
            postvars = self.parse_POST()
            ...
    
        ...
    
    推荐文章