2015-08-31 4 views
10

Ich führe den folgenden Code aus, um POST-Nachrichten zu erhalten. Wie bekomme ich die Datei (mit POST gesendet) und wie antworte ich mit HTTP-Statuscode 200 OK?Abrufen der Datei von der POST-Anfrage mit Pythons BaseHTTPServer

#!/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' object has no attribute 'FILES'

Antwort

1

Es ist im Allgemeinen in

request.FILES 

Wörterbuch verfügbar

+0

In Django vielleicht, aber das ist nicht Django. –

8

BaseHTTPRequestHandler wird die erste Zeile und die Header der HTTP-Anforderung dann überlassen Sie den Rest bis zu Ihnen verarbeiten. Sie müssen den Rest des Antrags BaseHTTPRequestHandler.rfile

Sie können self.send_response(200) mit, um lesen mit 200 OK

Angesichts der curl Befehl von Ihnen angegebenen zu reagieren haben sollte folgendes Ihre Frage beantworten:

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) 

Hinweis dass Sie mit -d @../some.file in Ihrem Curl-Befehl sagen: "Dies ist eine ASCII-Datei, oh und Streifen Sie die Zeilenumbrüche und Wagenrücklauf bitte", so könnte es Unterschiede zwischen der Datei, die Sie verwenden, und den Daten, die Sie erhalten die Anfrage. Ihr curl-Befehl emuliert kein html-Datei-Upload-Formular wie eine Post-Anfrage.

Verwandte Themen