[英]How to pass Queue to baseHTTPServer
我将示例与波纹管一起使用,它是一个简单的http服务器,用于侦听发布请求并收集主进程的数据。 我想将其转换为使用多处理并传递一个Queue来收集POST数据,但是我不确定如何传递它,关于如何执行传递的任何想法?
from threading import Thread
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from io import BytesIO
KEEP_RUNNING = True
COLLECT_POST_DATA = []
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['Content-Length'])
body = self.rfile.read(content_length)
print("body: {}".format(body))
COLLECT_POST_DATA.append(body)
self.send_response(200)
self.end_headers()
response = BytesIO()
response.write(b'This is POST request. ')
response.write(b'Received: ')
response.write(body)
self.wfile.write(response.getvalue())
def run_server(port):
httpd = HTTPServer(('0.0.0.0', port), SimpleHTTPRequestHandler)
httpd.timeout = 1
while KEEP_RUNNING:
httpd.handle_request()
# httpd.serve_forever()
t = Thread(target = run_server, args=(8000,))
t.start()
# to kill
KEEP_RUNNING = False
所以我解决了:
import multiprocessing
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from io import BytesIO
class QueuingHTTPServer(HTTPServer):
# def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, queue=False):
def __init__(self, server_address, RequestHandlerClass, queue, bind_and_activate=True):
HTTPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate)
self.queue = queue
class PostHTTPRequestHandler(BaseHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['Content-Length'])
body = self.rfile.read(content_length)
print("body: {}".format(body))
self.send_response(200)
self.end_headers()
response = BytesIO()
response.write(b'This is POST request. ')
response.write(b'Received: ')
response.write(body)
self.wfile.write(response.getvalue())
self.server.queue.put(body)
def run_server(port, queue):
print('run_server')
httpd = QueuingHTTPServer(('0.0.0.0', port), PostHTTPRequestHandler, queue)
httpd.timeout = 2
while True:
httpd.handle_request()
# httpd.serve_forever()
queue = multiprocessing.Queue()
p = multiprocessing.Process(target=run_server, name='serve', args=(8000, queue))
p.start()
尝试使用:
curl hostip:8000 -m 5 -d"12.12.12.12"
然后从脚本中:
data = queue.get(timeout=2)
杀死:
p.terminate()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.