This shows you the differences between two versions of the page.
— |
basicwebserver [2014/10/25 21:52] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | === Basic Web server in Python == | ||
+ | <code> | ||
+ | #Copyright Jon Berg , turtlemeat.com | ||
+ | |||
+ | import string,cgi,time | ||
+ | from os import curdir, sep | ||
+ | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer | ||
+ | import logging | ||
+ | import logging.config | ||
+ | |||
+ | logger = 0 | ||
+ | PORT = 8080 # change this to suit your current test | ||
+ | |||
+ | class MyHandler(BaseHTTPRequestHandler): | ||
+ | |||
+ | def do_GET(self): | ||
+ | try: | ||
+ | if self.path.endswith(".html"): | ||
+ | logger.info('Path = '+self.path) | ||
+ | f = open(curdir + sep + self.path) #self.path has /test.html | ||
+ | #note that this potentially makes every file on your computer readable by the internet | ||
+ | self.send_response(200) | ||
+ | self.send_header('Content-type', 'text/html') | ||
+ | self.end_headers() | ||
+ | self.wfile.write(f.read()) | ||
+ | f.close() | ||
+ | return | ||
+ | if self.path.endswith(".esp"): #our dynamic content | ||
+ | logger.info('Path = '+self.path) | ||
+ | self.send_response(200) | ||
+ | self.send_header('Content-type', 'text/html') | ||
+ | self.end_headers() | ||
+ | self.wfile.write("hey, today is the" + str(time.localtime()[7])) | ||
+ | self.wfile.write(" day in the year " + str(time.localtime()[0])) | ||
+ | self.wfile.write("<br>") | ||
+ | self.wfile.write("Time now is : "+time.strftime("%b, %d %Y %H:%M:%S")) | ||
+ | return | ||
+ | if self.path.endswith("/"): # default to index.html | ||
+ | logger.info('Path = /') | ||
+ | f = open(curdir + sep + "index.html") #self.path has /test.html | ||
+ | #note that this potentially makes every file on your computer readable by the internet | ||
+ | self.send_response(200) | ||
+ | self.send_header('Content-type', 'text/html') | ||
+ | self.end_headers() | ||
+ | self.wfile.write(f.read()) | ||
+ | f.close() | ||
+ | return | ||
+ | if self.path.find("/callback") != -1: | ||
+ | logger.info('Path = '+self.path) | ||
+ | #print dir(self) | ||
+ | #print self.requestline | ||
+ | args = self.requestline | ||
+ | if args.find('?') != -1: | ||
+ | opts = args.split(' ')[1][len("/callback?"):] | ||
+ | print opts | ||
+ | else: | ||
+ | opts = 'no args' | ||
+ | print opts | ||
+ | self.send_response(200) | ||
+ | self.send_header('Content-type', 'text/html') | ||
+ | self.end_headers() | ||
+ | self.wfile.write("callback invoked<br>") | ||
+ | self.wfile.write(opts) | ||
+ | self.wfile.write("<br>") | ||
+ | return | ||
+ | if self.path.find("ProvisionerCallback.svc") != -1: | ||
+ | logger.info('Path = ProvisionerCallback.svc') | ||
+ | print('Path = ProvisionerCallback.svc') | ||
+ | args = self.requestline | ||
+ | onlyCmd = None | ||
+ | print "Args="+args | ||
+ | if args.find('?') != -1: | ||
+ | opts = args.split(' ')[1] | ||
+ | onlyCmd = opts.split('?')[1].split('&') | ||
+ | print onlyCmd | ||
+ | else: | ||
+ | opts = 'no args' | ||
+ | print onlyCmd | ||
+ | self.send_response(200) | ||
+ | self.send_header('Content-type', 'text/html') | ||
+ | self.end_headers() | ||
+ | self.wfile.write("callback ProvisionerCallback.svc<br>") | ||
+ | self.wfile.write(onlyCmd) | ||
+ | self.wfile.write("<br>") | ||
+ | return | ||
+ | except IOError: | ||
+ | self.send_error(404,'File Not Found: %s' % self.path) | ||
+ | |||
+ | # def do_GET(self): | ||
+ | # print "do_GET called" | ||
+ | # args = self.requestline | ||
+ | # if args.find('?') != -1: | ||
+ | # print args.split(' ')[1][len("/callback?"):] | ||
+ | # #print self.command | ||
+ | # self.send_response(200) | ||
+ | # self.end_headers() | ||
+ | # self.wfile.write("<HTML>That's all folks!!!<BR><BR></html>"); | ||
+ | # | ||
+ | |||
+ | def do_POST(self): | ||
+ | try: | ||
+ | ctype, pdict = cgi.parse_header(self.headers.getheader('content-type')) | ||
+ | if ctype == 'multipart/form-data': | ||
+ | query=cgi.parse_multipart(self.rfile, pdict) | ||
+ | self.send_response(301) | ||
+ | | ||
+ | self.end_headers() | ||
+ | upfilecontent = query.get('upfile') | ||
+ | print "filecontent", upfilecontent[0] | ||
+ | self.wfile.write("<HTML>POST OK.<BR><BR>"); | ||
+ | self.wfile.write(upfilecontent[0]); | ||
+ | | ||
+ | except : | ||
+ | pass | ||
+ | |||
+ | def main(): | ||
+ | global logger | ||
+ | logging.config.fileConfig('..\\py_logging.conf') | ||
+ | moduleName = 'Web' | ||
+ | logger = logging.getLogger(moduleName) | ||
+ | try: | ||
+ | server = HTTPServer(('', PORT), MyHandler) | ||
+ | print 'started httpserver...' | ||
+ | server.serve_forever() | ||
+ | except KeyboardInterrupt: | ||
+ | print '^C received, shutting down server' | ||
+ | server.socket.close() | ||
+ | |||
+ | if __name__ == '__main__': | ||
+ | main() | ||
+ | </code> | ||
+ | |||
+ | Logging file config | ||
+ | |||
+ | <code> | ||
+ | # log.ini | ||
+ | |||
+ | [loggers] | ||
+ | keys=root | ||
+ | |||
+ | [handlers] | ||
+ | keys=default | ||
+ | |||
+ | [formatters] | ||
+ | keys=default | ||
+ | |||
+ | [logger_root] | ||
+ | level=INFO | ||
+ | handlers=default | ||
+ | qualname=(root) # note - this is used in non-root loggers | ||
+ | propagate=1 # note - this is used in non-root loggers | ||
+ | channel= | ||
+ | parent= | ||
+ | |||
+ | [handler_default] | ||
+ | class=handlers.TimedRotatingFileHandler | ||
+ | level=INFO | ||
+ | formatter=default | ||
+ | args=('web.log', 'H', 12) | ||
+ | filename=web.log | ||
+ | |||
+ | [formatter_default] | ||
+ | format=%(asctime)s %(pathname)s(%(lineno)d): %(levelname)s %(message)s | ||
+ | datefmt= | ||
+ | </code> | ||
+ | |||
+ | * [[pythoninfo|Back to Python]] |