2015-02-03 4 views
1

파이썬 2.7에서는 do_POST 메소드를 지원하도록 BaseHTTPServer.BaseHTTPRequestHandler를 확장했습니다. 큐에 게시 된 데이터를 다른 스레드에서 처리 할 수 ​​있도록 요청 처리기에 큐를 제공하고 싶습니다. 여기 Python 2 BaseHTTPRequestHandler에 대기열을 넣는 방법?

내 클래스의 버전을 박탈입니다 :

import BaseHTTPServer 
import json 

class PostHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): 

    def do_POST(self): 
     self.send_response(200) 
     self.end_headers() 

     length = int(self.headers['Content-Length']) 
     self.post_data = self.rfile.read(length) 

     try: 
      if self.headers['Content-Type'] == 'application/json': 
       self.post_data = json.loads(self.post_data) 
       self.log_message(json.dumps(self.post_data)) 

       ### WANT TO PUT self.post_data ON A QUEUE HERE ### 

     except KeyError as error: 
      self.log_message('No Content-Type header') 
     except ValueError as error: 
      self.log_message("%s" % error) 

후 처리기가 BaseHTTPServer에 의해 작성되는 이후, 나는 큐에 전달하는 초기화를 방법을 바꿀 수 있다고 생각하지 않습니다.

내가 원하는 내 주요()이 같은보고 :

def main(): 

    import logging 
    import Queue 
    import signal 
    import threading 
    import traceback 


    try: 
     # set stoprequest to accept Ctrl+c 
     stoprequest = threading.Event() 
     signal.signal(signal.SIGINT, lambda signal, frame: stoprequest.set()) 

     args = _get_main_args() 

     ### HERE IS THE QUEUE, HOW TO I GIVE A REFERENCE TO THE HANDLER??? ### 
     data_queue = Queue.Queue() 

     handler = PostHTTPRequestHandler 

     server = BaseHTTPServer.HTTPServer((args.address, args.port), handler) 

     server_thread = threading.Thread(target=server.serve_forever) 
     server_thread.daemon = True 
     server_thread.start() 

     while not stoprequest.is_set(): 

      try: 
       data = data_queue.get(False) 

       ### I WANT TO PROCESS THE DATA HERE ### 

      except Queue.Empty: 
       pass 

     server.shutdown() 

     #logging.debug("Exiting with return code 0") 
     return 0 

    except Exception: 
     sys.stderr.write("%s" % traceback.format_exc()) 
     return 1 

답변

0

내가 지금 BaseRequestHandler에 대한 초기화는 다음과 같습니다 것을 볼 :

class BaseRequestHandler: 

    def __init__(self, request, client_address, server): 
     self.request = request 
     self.client_address = client_address 
     self.server = server 
     self.setup() 
     try: 
      self.handle() 
     finally: 
      self.finish() 

그래서 연장됩니다 BaseHTTPServer는 큐를 포함하기 위해 핸들러에서 사용할 수 있습니다.

class QueuingHTTPServer(BaseHTTPServer.HTTPServer): 

    def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True): 
     BaseHTTPServer.HTTPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate) 
     self.data_queue = Queue.Queue() 

는 이제 핸들러는 다음과 같습니다

class PostHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): 

    def do_POST(self): 
     self.send_response(200) 
     self.end_headers() 

     length = int(self.headers['Content-Length']) 
     self.post_data = self.rfile.read(length) 

     try: 
      if self.headers['Content-Type'] == 'application/json': 
       self.post_data = json.loads(self.post_data) 
       self.log_message(json.dumps(self.post_data)) 

       try: 
        self.server.data_queue.put(self.post_data) 
       except Queue.Full: 
        pass 

     except KeyError as error: 
      self.log_message('No Content-Type header') 
     except ValueError as error: 
      self.log_message("%s" % error) 
0

내가 대신 인스턴스 중 하나를 만드는 공유 큐 참조를 사용하는 조쉬가 제출 한 코드를 수정했습니다.