首页 > 解决方案 > Python - 使用 HTTPServer 处理并发 POST 请求并保存到文件

问题描述

我有下面的代码,我想用它来接收带有数据的 POST 请求,然后我将使用这些数据在标签打印机上打印标签。为了打印标签,我需要使用打印命令编写一个文件,然后lp通过命令行执行命令将文件复制到标签打印机。

我遇到的问题是多个人可能同时打印标签。所以我的问题是我是否必须更改下面的代码才能使用ThreadingMixIn以处理并发 POST 请求,或者我可以保留代码原样并且在并发场景中的辅助请求只会有一点延迟(即任何进一步的请求将排队并且不会丢失)?

如果我必须采用线程方式,lp如果现在有多个线程试图写入同一个文件,这将如何影响文件的写入和后续的命令行调用?

请注意,有多个标签打印机正在通过打印队列 (CUPS) 进行访问。

import json
from http.server import HTTPServer, BaseHTTPRequestHandler
from io import BytesIO

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')
            self.send_response(200)
            self.end_headers()
            response = BytesIO()
            response.write(b'This is POST request. ')
            response.write(b'Received: ')
            response.write(body)
            self.wfile.write(response.getvalue())
        except Exception as exc:
            self.wfile.write('Request has failed to process. Error: %s', exc.message)

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

标签: python

解决方案


为什么不尝试使用唯一的文件名?通过这种方式,您可以确定不会发生名称冲突。看看https://docs.python.org/2/library/tempfile.html,考虑 NamedTemporaryFile 函数。您应该使用 delete=False,否则文件在 close() 之后立即被删除。


推荐阅读