如何将SimpleHTTPServer代码更改为等效的生产服务器

时间:2019-03-18 17:58:18

标签: python simplehttpserver

我编写了以下代码来接受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 Web服务器,但是我不确定如何向其中添加上面的Python代码(最好不要过多更改上面的代码,因为有很多)。

1 个答案:

答案 0 :(得分:0)

I found out a way to connect your code with nginx server. At first add some code with your function add create socket and after that write a nginx conf file. it will work

Step 1 :

add main() function in your function

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()

Step 2 :

nginx.conf file should be like this

server {

    location / {
        root /data/www;
    }


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

If face any issue comment below