I\'m trying to make a simple python webserver to save text that is Posted to a file called store.json which is in the same folder as the python scr
Important thing is that you will have to build cgi.FieldStorage properly from the raw posted data e.g.
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD':'POST',
'CONTENT_TYPE':self.headers['Content-Type'],
})
after that it is easy to dump file, here is a simple handler which shows a form on do_GET to upload any file user chooses and saves that file to /tmp in do_POST when form is POSTed
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)
Also note that self.respond is not a standard method I just added it for quickly returning some response.
Here's the general idea:
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%