Получить файл из запроса POST с помощью Python BaseHTTPServer

Я запускаю код ниже, чтобы получать сообщения POST. Как получить файл (отправленный с POST) и как я могу ответить с кодом состояния HTTP 200 OK?

#!/usr/bin/env python

import ssl
import BaseHTTPServer, SimpleHTTPServer
from BaseHTTPServer import BaseHTTPRequestHandler

class HttpHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        print "got POST message"
        # how do I get the file here?
        print self.request.FILES


httpd = BaseHTTPServer.HTTPServer(('localhost', 4443), HttpHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile='./server.pem', server_side=True)
httpd.serve_forever()    



$curl -X POST -d @../some.file https://localhost:4443/resource --insecure

AttributeError: объект "SSLSocket" не имеет атрибута "FILES"

Ответ 1

BaseHTTPRequestHandler обработает первую строку, а заголовки HTTP-запроса оставят вас остальными. Вы должны прочитать оставшуюся часть запроса, используя BaseHTTPRequestHandler.rfile

Вы можете использовать self.send_response(200) для ответа 200 OK

Учитывая указанную команду curl, вы должны ответить на ваш вопрос:

class HttpHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        file_content = self.rfile.read(content_length)

        # Do what you wish with file_content
        print file_content

        # Respond with 200 OK
        self.send_response(200)

Обратите внимание, что, используя -d @../some.file в вашей команде curl, вы говорите: "Это файл ascii, oh и вычеркнуть новые строки и возвращает каретки", таким образом, могут быть различия между используемым вами файлом и данными вы получите запрос. Ваша команда curl не эмулирует загрузку файла формы html как запрос на отправку.

Ответ 2

Обычно он доступен в

request.FILES

словарь