web-dev-qa-db-ja.com

python http.serverでCGI "hello world"を実行する方法

私はWindows 7を使用しています。Python 3.4.3。ブラウザーでこの単純なhelloworld.pyファイルを実行したいと思います。

print('Content-Type: text/html')
print( '<html>')
print( '<head></head>')
print( '<body>')
print( '<h2>Hello World</h2>')
print( '</body></html>')

私がやることは:

1)コマンドラインに移動C:\Python(pythonがインストールされている場合)

2)実行:python -m http.server

3)Firefoxに移動して、http://localhost:8000/hello.py

ただし、「Hello World」の代わりに、ブラウザはhello.pyファイルのコンテンツを印刷するだけです。

どうすれば修正できますか?

16
Yura

From the http.server docs

CGIHTTPRequestHandlerは、--cgiオプション:

$ python3 -m http.server --bind localhost --cgi 8000

スクリプトを cgi_directories

デフォルトは['/cgi-bin', '/htbin']およびCGIスクリプトを含むものとして扱うディレクトリについて説明します。

ブラウザで開きます:

$ python -mwebbrowser http://localhost:8000/cgi-bin/hello.py

どこ hello.py

#!/usr/bin/env python3
print("Content-Type: text/html\n")
print("<!doctype html><title>Hello</title><h2>hello world</h2>")

POSIXで実行可能にする必要がありました:chmod +x cgi-bin/hello.py

15
jfs

Python2.7でこれをやった

from BaseHTTPServer import BaseHTTPRequestHandler

class GetHandler(BaseHTTPRequestHandler):

    def do_HEAD(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()

    def do_GET(self):
        x = self.wfile.write
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        # <--- HTML starts here --->
        x("<html>")
        # <--- HEAD starts here --->
        x("<head>")
        x("<title>Title goes here!</title>")
        x("</head>")
        # <--- HEAD ends here --->
        # <--- BODY starts here --->
        x("<body>")
        x("<p>This is a test.</p>")
        x("</body>")
        # <--- BODY ends here --->
        x("</html>")
        # <--- HTML ends here --->

if __name__ == '__main__':
    from BaseHTTPServer import HTTPServer
    server = HTTPServer(('localhost', 777), GetHandler)
    print 'Starting server, use <Ctrl + F2> to stop'
    server.serve_forever()

だからPython 3では、インポートを変更するだけです

from http.server import BaseHTTPRequestHandler

class GetHandler(BaseHTTPRequestHandler):

    def do_HEAD(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()

    def do_GET(self):
        x = self.wfile.write
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        # <--- HTML starts here --->
        x("<html>")
        # <--- HEAD starts here --->
        x("<head>")
        x("<title>Title goes here!</title>")
        x("</head>")
        # <--- HEAD ends here --->
        # <--- BODY starts here --->
        x("<body>")
        x("<p>This is a test.</p>")
        x("</body>")
        # <--- BODY ends here --->
        x("</html>")
        # <--- HTML ends here --->

if __name__ == '__main__':
    from http.server import HTTPServer
    server = HTTPServer(('localhost', 777), GetHandler)
    print('Starting server, use <Ctrl + F2> to stop')
    server.serve_forever()

python 3のprint-functionが

print("")

または

print ""

しかし、私はそれが()であったと思います

編集:print()です

2

友達のために 完全な例 を作成しました。これは、8つの簡単なコピーアンドペースト可能なコード行で実行できる完全なデモです。楽しい。

echo -e "\n\n    Usage: after running this script, visit http://localhost:8000/cgi-bin/hello    \n\n"
mkdir /tmp/cgi-bin/
cat > /tmp/cgi-bin/hello <<EOF
#!/bin/bash
echo -e "Content-Type: text/plain\n\n"; date; echo; env
EOF
chmod +x /tmp/cgi-bin/hello
(cd /tmp; python3 -m http.server --cgi 8000)
1
Bruno Bronosky