我已经看到了this个问题,但我希望能够从处理程序中访问外部数据。
有办法做到这一点吗?
以下是代码:
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在Handler期间被评估,但在MyHandler
之后不被评估答案 0 :(得分:9)
这是因为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)
无论如何,我不确定你想通过在服务器和requestHandler上下文之外使用变量来实现什么。
答案 1 :(得分:3)
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
您可以使用此服务器将postVars保存在服务器上,如:
class 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
一般来说,解决方案比拥有全局变量更可取。