扩展BaseHTTPRequestHandler - 获取提交的数据

6 投票
2 回答
12586 浏览
提问于 2025-04-16 18:46

我看到过这个问题,但是我想要在处理程序之外访问那些通过POST发送的数据。

有没有办法做到这一点呢?

下面是代码:

import BaseHTTPServer

HOST_NAME = ''
PORT_NUMBER=8088

postVars = ''

class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):

    def do_POST(s):
        s.send_response(200)
        s.end_headers()
        varLen = int(s.headers['Content-Length'])
        postVars = s.rfile.read(varLen)
        print postVars

server_class = BaseHTTPServer.HTTPServer
httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)

try:
    httpd.handle_request()
except KeyboardInterrupt:
    pass

print postVars
httpd.server_close()

在处理程序中,postVars有值,但在MyHandler之后就没有了。

2 个回答

8

BaseHTTPServerBaseHTTPRequestHandler 的一个属性。这意味着你可以在服务器上使用 postVars。

如果你像下面这样创建一个 BaseHTTPServer 的子类:

class MyServer(BaseHTTPServer.HTTPServer):
    def __init__(self, *args, **kwargs):
         # Because HTTPServer is an old-style class, super() can't be used.
         BaseHTTPServer.HTTPServer.__init__(self, *args, **kwargs)
         self.postVars = None

你可以用这个服务器在服务器上保存 postVars,方法如下:

class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):

    def do_POST(s):
        s.send_response(200)
        s.end_headers()
        varLen = int(s.headers['Content-Length'])
        s.server.postVars = s.rfile.read(varLen)
        print postVars

然后当然可以用 MyServer 来代替 BaseHTTPServer:

server_class = MyServer
httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)

print httpd.postVars

一般来说,这种方法比使用全局变量要更好。

10

这是因为 postVars 这个变量只在由 HTTPServer 创建的 MyHandler 实例中有效。如果你想访问它,可以在 do_POST 方法的开头把 postVars 声明为全局变量。

def do_POST(s):
  global postVars
  s.send_response(200)
  s.end_headers()
  varLen = int(s.headers['Content-Length'])
  postVars = s.rfile.read(varLen)

不过,我不太明白你想通过在服务器和请求处理器的上下文之外使用变量来达到什么目的。

撰写回答