ブラウザから実行したいPythonスクリプトがあります。mod_wsgiを使用する方法のようですが、メソッドの重みが大きすぎるため、出力用にスクリプトを変更する必要があります。理想的にはphpアプローチが欲しいと思います。スクリプトは入力を受け取らず、内部ネットワークでのみアクセスできます。
mod_wsgiがすでに設定されているLinuxでApacheを実行していますが、ここでのオプションは何ですか?
Pythonのマイクロフレームワークのいずれかを使用して、サーバーからスクリプトをすばやく実行できます。ほとんどの場合、独自の軽量サーバーが含まれています。
チェリーピーのホームページのドキュメントから
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)
マイクロフレームワークの優れている点は、ヘッダーなどの書き込みを抽象化することです(ただし、必要に応じて、へのインターフェイスを提供する必要があります)
要件が変更された場合に備えて、マイクロフレームワークのアプローチを採用します。これは、基本的なダンプではなくアプリになる可能性があります。おそらく最も単純な(そして昔ながらの方法です!?)CGIを使用しています。
print 'Content-Type: text/plain\n'
他の出力の前に含めるsys.stdout
.py
ApacheCGIハンドラーに追加されていることを確認してくださいしかし-とにかく、これが素晴らしい利点になるとは思いません(少なくとも長期的には)