Как изменить код SimpleHTTPServer на эквивалентный производственный сервер - PullRequest
1 голос
/ 18 марта 2019

Я написал следующий код, чтобы принять HTTP POST, а затем записать временный файл, содержащий данные POST, а затем отправить этот временный файл на принтер, используя subprocess и команду UNIX lp.

from http.server import HTTPServer, BaseHTTPRequestHandler

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        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)
        try:
            result = json.loads(body, encoding='utf-8')
            # Do other stuff with result
            p = subprocess.Popen(['/usr/bin/env', 'lp', '-d', printer_queue, temp.name], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            self.send_response(200)
            self.end_headers()
            response = BytesIO()
            response.write(b'POST Received: ')
            response.write(body)
            self.wfile.write(response.getvalue())
        except Exception as err:
            tb = traceback.format_exc()
            print(tb)
            self.send_response(500)   # 500 Internal Server Error
            self.end_headers()
            response = BytesIO()
            response.write(b'ERROR: Blah')
            self.wfile.write(response.getvalue())

httpd = HTTPServer(('localhost', 8000), SimpleHTTPRequestHandler)

и все было замечательно.Затем я прочитал, что HTTPServer не следует использовать в Production, и все перестало быть потрясающим.

Итак, как я могу написать эквивалентный код, который можно использовать в качестве рабочего сервера?У меня есть веб-сервер Apache, но я не уверен, как добавить к нему приведенный выше код Python (желательно, не меняя его слишком сильно, поскольку его много).

1 Ответ

0 голосов
/ 19 марта 2019

Я нашел способ соединить ваш код с сервером nginx. Сначала добавьте код с вашей функцией add create socket, а затем напишите файл конфигурации nginx. это будет работать

Шаг 1:

добавить функцию main () в вашу функцию

from http.server import HTTPServer, BaseHTTPRequestHandler

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        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)
        try:
            result = json.loads(body, encoding='utf-8')
            # Do other stuff with result
            p = subprocess.Popen(['/usr/bin/env', 'lp', '-d', printer_queue, temp.name], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            self.send_response(200)
            self.end_headers()
            response = BytesIO()
            response.write(b'POST Received: ')
            response.write(body)
            self.wfile.write(response.getvalue())
        except Exception as err:
            tb = traceback.format_exc()
            print(tb)
            self.send_response(500)   # 500 Internal Server Error
            self.end_headers()
            response = BytesIO()
            response.write(b'ERROR: Blah')
            self.wfile.write(response.getvalue())


def main():
    try:
        server = HTTPServer(('localhost', 8000), SimpleHTTPRequestHandler)
        print ('Starting BaseServer.')
        server.serve_forever ()
    except KeyboardInterrupt:
        print ('Interrupt recieved; closing server socket')
        server.socket.close()

if __name__ == '__main__':
    main()

Шаг 2:

Файл nginx.conf должен выглядеть следующим образом

server {

    location / {
        root /data/www;
    }


    location / {
        proxy_pass http://localhost:8000;
    }
}

Если у вас есть какие-либо проблемы, прокомментируйте ниже

...