1

我有一个我想从浏览器运行的 Python 脚本,似乎 mod_wsgi 是要走的路,但该方法感觉太重了,需要修改脚本以输出。我想我想要一种理想的 php 方法。这些脚本不接受任何输入,只能在内部网络上访问。

我在已经设置了 mod_wsgi 的 Linux 上运行 apache,这里有哪些选项?

4

2 回答 2

3

您可以使用任何 python 的微框架从服务器快速运行您的脚本。大多数包括他们自己的轻量级服务器。

来自cherrypy主页文档

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

cherrypy.quickstart(HelloWorld())

另外,python 提供了使用HttpServer在其标准库中执行所需操作所需的工具

使用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)

微框架的好处是它们抽象出编写标题等(但如果需要,仍应为您提供一个接口)

于 2012-12-12T13:56:13.780 回答
3

我会采用微框架方法以防万一您的需求发生变化-您永远不知道,它最终可能成为一个应用程序,而只是一个基本的转储......也许最简单的(和老式的方式!?)是使用 CGI:

  • 复制您的脚本并print 'Content-Type: text/plain\n'在任何其他输出之前包含sys.stdout
  • 将该脚本放在apache2可以访问的地方(例如您的cgi-bin)
  • 确保脚本是可执行的
  • 确保.py已添加到 Apache CGI 处理程序

但是 - 我不认为这将是一个了不起的优势(至少从长远来看)

于 2012-12-12T14:30:45.137 回答