This way you don't need to write a server, design a protocol, ... Just use an existing HTTP server (such as lighttpd) with CGI.
CGI Script:
#!/usr/bin/env python
from cgi import FieldStorage
from myapp import do_something_with_data
ERROR = "<html><body>Error: %s</body></html>"
def main():
print "Content-Type: text/html"
print
form = FieldStorage()
data = form.getvalue("data", "")
key = form.getvalue("key", "").strip()
if not (key and data):
raise SystemExit(ERROR % "NO 'key' or 'data'")
try:
do_something_with_data(key, data)
except Exception, e:
raise SystemExit(ERROR % e)
print "<html><body>OK</body></html>"
if __name__ == "__main__":
main()
"Pushing" script:
#!/usr/bin/env python
from urllib import urlopen, urlencode
CGI_URL = "http://localhost:8080/load.cgi"
def push_data(key, data):
query = urlencode([("data", data), ("key", key)])
try:
urlopen(CGI_URL, query).read()
except IOError, e:
pass # FIXME: Handle error
def main(argv=None):
if argv is None:
import sys
argv = sys.argv
from optparse import OptionParser
from os.path import isfile, basename
parser = OptionParser("usage: %prog FILENAME")
opts, args = parser.parse_args(argv[1:])
if len(args) != 1:
parser.error("wrong number of arguments") # Will exit
filename = args[0]
if not isfile(filename):
raise SystemExit("error: can't find %s" % filename)
key = basename(filename)
data = open(filename, "rb").read()
push_data(key, data)
if __name__ == "__main__":
main()
(Thanks to Martin for the idea)