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之后
这是因为postVars在HTTPServer创建的MyHandler实例中受本地影响.如果要访问它,请postVars在do_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上下文之外使用变量来实现什么.
小智 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)
通常,该解决方案比具有全局变量更可取。