Получить значение вне метода DO_POST http.server - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь прослушать сообщение json через порт HTTP. Мне удается получить значения в методе DO_POST, но я не знаю, как использовать его из метода. Я использую python. Я хочу поместить сообщение в очередь, которая будет разделена между несколькими процессами. Я попытался переопределить методы класса BaseHTTPRequestHandler, но он не работает, когда я пытаюсь создать новые атрибуты для класса.

Он работает с глобальной переменной, но я думаю, что это не лучший способ. Он будет работать со всеми файлами в одном и том же файле python, но я хотел бы только импортировать модуль и использовать его в основном файле.

from http.server import HTTPServer, BaseHTTPRequestHandler
import socketserver
import socket, sys, threading, queue
import configparser
from io import BytesIO
import json

def decode_json(strjson):
    d = json.loads(strjson)
    msg = d.get("msg")
    return msg

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        global salut
        print(salut)
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'Hello, world!')

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        body = self.rfile.read(content_length)
        self.send_response(200)
        self.end_headers()
        response = BytesIO()
        response.write(b'This is POST request. ')
        response.write(b'Received: ')
        response.write(body)
        msg = decode_json(body.decode("UTF-8"))
        if msg:
            print(msg) ## GET THIS MESSAGE OUT OF THIS METHOD TO USE IT SOMEWHERE ELSE

        print(body.decode("UTF-8"))
        self.wfile.write(response.getvalue())

    def serve_forever(port,test):
        print(test)
        socketserver.TCPServer(('', port), SimpleHTTPRequestHandler).serve_forever()

class ServerHTTP(HTTPServer,threading.Thread):
    def __init__(self,queue):
        self.queue = queue
        self.stopped = False
        host, port = self.init()
        threading.Thread.__init__(self)
        HTTPServer.__init__(self,(host, port), SimpleHTTPRequestHandler)


    #Read Host and port from an INI file tcpServer.cfg
    def init(self):
        config = configparser.ConfigParser()
        config.read('ServeurHTTP.cfg')
        HOST = config.get("CFG","HOST")
        PORT = config.getint("CFG","PORT")
        return HOST, PORT

    def serve_forever(self):
        while not self.stopped:
            self.handle_request()

    def run(self):
        self.serve_forever()

if __name__ == "__main__":
    q=queue.Queue()
    s = ServerHTTP(q)
    s.start()

...