2012-10-30 6 views
12

Sto cercando di creare un semplice server web Python per salvare il testo che è Post ed in un file chiamato store.json che si trova nella stessa cartella dello script python. Ecco metà del mio codice, qualcuno può dirmi quale dovrebbe essere il resto?Simple Python Webserver per salvare il file

import string,cgi,time 
from os import curdir, sep 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
#import pri 

class StoreHandler(BaseHTTPRequestHandler): 
def do_GET(self): 
    try: 
     if self.path == "/store.json": 
      f = open(curdir + sep + "store.json") #self.path has /test.html 
      self.send_response(200) 
      self.send_header('Content-type','text/json') 
      self.end_headers() 
      self.wfile.write(f.read()) 
      f.close() 
      return 
     return 
    except IOError: 
     self.send_error(404,'File Not Found: %s' % self.path) 
def do_POST(self): 
    //if the url is 'store.json' then 
    //what do I do here? 

def main(): 
    try: 
     server = HTTPServer(('', 80), StoreHandler) 
     print 'started...' 
     server.serve_forever() 
    except KeyboardInterrupt: 
     print '^C received, shutting down server' 
     server.socket.close() 
if __name__ == '__main__': 
    main() 

risposta

26

Ecco l'idea generale:

from os import curdir 
from os.path import join as pjoin 

from http.server import BaseHTTPRequestHandler, HTTPServer 

class StoreHandler(BaseHTTPRequestHandler): 
    store_path = pjoin(curdir, 'store.json') 

    def do_GET(self): 
     if self.path == '/store.json': 
      with open(self.store_path) as fh: 
       self.send_response(200) 
       self.send_header('Content-type', 'text/json') 
       self.end_headers() 
       self.wfile.write(fh.read().encode()) 

    def do_POST(self): 
     if self.path == '/store.json': 
      length = self.headers['content-length'] 
      data = self.rfile.read(int(length)) 

      with open(self.store_path, 'w') as fh: 
       fh.write(data.decode()) 

      self.send_response(200) 


server = HTTPServer(('', 8080), StoreHandler) 
server.serve_forever() 
$ curl -X POST --data "one two three four" localhost:8080/store.json 
$ curl -X GET localhost:8080/store.json  
one two three four% 
+0

Dice 'ImportError: nessun modulo chiamato 'BaseHTTerver'' –

+2

Ok, è necessario cambiare' da BaseHTTerver' a 'da http.server' –

+1

Spiacente, non abbiamo notato la parte' -3.x' del tag. – gvalkov

7

cosa importante è che si dovrà costruire cgi.FieldStorage correttamente dal grezzo ha registrato dati di esempio

form = cgi.FieldStorage(
      fp=self.rfile, 
      headers=self.headers, 
      environ={'REQUEST_METHOD':'POST', 
        'CONTENT_TYPE':self.headers['Content-Type'], 
        }) 

dopo che è facile per scaricare il file, ecco un semplice gestore che mostra un modulo sul do_GET per caricare qualsiasi utente di file sceglie e salva il file in/tmp in do_POST se il modulo è Pubblicato

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler 

import cgi 

class StoreHandler(BaseHTTPRequestHandler): 
    def do_POST(self): 

     form = cgi.FieldStorage(
      fp=self.rfile, 
      headers=self.headers, 
      environ={'REQUEST_METHOD':'POST', 
        'CONTENT_TYPE':self.headers['Content-Type'], 
        }) 
     filename = form['file'].filename 
     data = form['file'].file.read() 
     open("/tmp/%s"%filename, "wb").write(data) 

     self.respond("uploaded %s, thanks"%filename) 

    def do_GET(self): 
     response = """ 
     <html><body> 
     <form enctype="multipart/form-data" method="post"> 
     <p>File: <input type="file" name="file"></p> 
     <p><input type="submit" value="Upload"></p> 
     </form> 
     </body></html> 
     """   

     self.respond(response) 

    def respond(self, response, status=200): 
     self.send_response(status) 
     self.send_header("Content-type", "text/html") 
     self.send_header("Content-length", len(response)) 
     self.end_headers() 
     self.wfile.write(response) 

Si noti inoltre che self.respond non è un metodo standard, l'ho appena aggiunto per restituire rapidamente una risposta.

+0

questo è Python 3, non SimpleHTTP ancora lavorare? Scusa, ho omesso di menzionarlo. –

+0

@ArlenBeiler Sono cambiato in BaseHTTPRequestHandler se questo funziona su python3, sembra che ci sia anche SimplreREquestHandler in python3 http://docs.python.org/3.3/library/http.server.html#http.server.SimpleHTTPRequestHandler –