扩展BaseHTTPRequestHandler - 获取发布的数据

Kev*_*imm 4 python variables networking http

我已经看到了这个问题,但我希望能够从处理程序访问外部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()
Run Code Online (Sandbox Code Playgroud)

postVars在Handler期间被评估,但不在MyHandler之后

Kal*_*zar 9

这是因为postVars在HTTPServer创建的MyHandler实例中受本地影响.如果要访问它,请postVarsdo_POST方法的开头声明为全局变量.

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

无论如何,我不确定你想通过在服务器和requestHandler上下文之外使用变量来实现什么.

  • 不知道你的真实上下文,但处理大量后处理的最好方法是将POST数据放在某种`queue`中,并拥有一个消耗队列的后端服务器进程. (5认同)
  • 为什么唯一的解决方案是使用全局变量? (3认同)

小智 7

BaseHTTPServer作为的属性可用BaseHTTPRequestHandler。这意味着您可以使 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
Run Code Online (Sandbox Code Playgroud)

您可以使用此服务器将 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
Run Code Online (Sandbox Code Playgroud)

然后当然使用MyServer而不是 BaseHTTPServer:

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

print httpd.postVars
Run Code Online (Sandbox Code Playgroud)

通常,该解决方案比具有全局变量更可取。