[英]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.