【问题标题】:How to change SimpleHTTPServer code to an equivalent production server如何将 SimpleHTTPServer 代码更改为等效的生产服务器
【发布时间】:2019-03-18 17:58:17
【问题描述】:

我编写了以下代码来接受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 不应该在生产中使用,一切都不再那么棒了。

那么如何编写可以用作生产服务器的等效代码呢?我有一个 Apache Web 服务器,但我不知道如何将上面的 Python 代码添加到它(最好不要过多地更改上面的代码,因为它有很多)。

【问题讨论】:

  • “生产”对您意味着什么?你认为你的 python 代码足够稳定,可以在生产服务器上运行吗?
  • “稳定”对您意味着什么?代码工作正常。生产意味着需要安全的系统。

标签: python simplehttpserver


【解决方案1】:

我找到了一种将您的代码与 nginx 服务器连接的方法。首先使用您的函数添加一些代码添加创建套接字,然后编写一个 nginx conf 文件。它会工作

第一步:

在你的函数中添加 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()

第二步:

nginx.conf文件应该是这样的

server {

    location / {
        root /data/www;
    }


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

如果遇到下面的任何问题评论

【讨论】:

  • 这并没有解决 OP 希望从 simplehttpserver 更改为不同设置的事实。这是有道理的,因为即使在官方文档中也声明不建议将 simplehttpserver 用于生产代码。
猜你喜欢
  • 2015-10-02
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2015-09-23
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多