Webserver to serve Python script

六眼飞鱼酱① 提交于 2019-12-08 07:48:34

问题


I have a Python script that I'd like to be run from the browser, it seem mod_wsgi is the way to go but the method feels too heavy-weight and would require modifications to the script for the output. I guess I'd like a php approach ideally. The scripts doesn't take any input and will only be accessible on an internal network.

I'm running apache on Linux with mod_wsgi already set up, what are the options here?


回答1:


I would go the micro-framework approach just in case your requirements change - and you never know, it may end up being an app rather just a basic dump... Perhaps the simplest (and old fashioned way!?) is using CGI:

  • Duplicate your script and include print 'Content-Type: text/plain\n' before any other output to sys.stdout
  • Put that script somewhere apache2 can access it (your cgi-bin for instance)
  • Make sure the script is executable
  • Make sure .py is added to the Apache CGI handler

But - I don't see anyway this is going to be a fantastic advantage (in the long run at least)




回答2:


You could use any of python's micro frameworks to quickly run your script from a server. Most include their own lightweight servers.

From cherrypy home page documentation

import cherrypy
class HelloWorld(object):
    def index(self):
        # run your script here
        return "Hello World!"
    index.exposed = True

cherrypy.quickstart(HelloWorld())

ADditionally python provides the tools necessary to do what you want in its standard library using HttpServer

A basic server using BaseHttpServer:

import time
import BaseHTTPServer


HOST_NAME = 'example.net' # !!!REMEMBER TO CHANGE THIS!!!
PORT_NUMBER = 80 # Maybe set this to 9000.


class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_HEAD(s):
        s.send_response(200)
        s.send_header("Content-type", "text/html")
        s.end_headers()
    def do_GET(s):
        """Respond to a GET request."""
        s.send_response(200)
        s.send_header("Content-type", "text/html")
        s.end_headers()
        s.wfile.write("<html><head><title>Title goes here.</title></head>")
        s.wfile.write("<body><p>This is a test.</p>")
        # If someone went to "http://something.somewhere.net/foo/bar/",
        # then s.path equals "/foo/bar/".
        s.wfile.write("<p>You accessed path: %s</p>" % s.path)
        s.wfile.write("</body></html>")

if __name__ == '__main__':
    server_class = BaseHTTPServer.HTTPServer
    httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
    print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER)
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        pass
    httpd.server_close()
    print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)

What's nice about the microframeworks is they abstract out writing headers and such (but should still provide you an interface to, if required)



来源:https://stackoverflow.com/questions/13841206/webserver-to-serve-python-script

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!