web-dev-qa-db-fra.com

Comment exécuter CGI "hello world" avec python http.server

J'utilise Windows 7 et Python 3.4.3. Je voudrais exécuter ce simple fichier helloworld.py dans mon navigateur:

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

Ce que je fais c'est:

1) Allez à la ligne de commande C:\Python (où python est installé)

2) exécuter: python -m http.server

3) Arrivé à Firefox et tapez http://localhost:8000/hello.py

Cependant, au lieu de "Hello World", le navigateur n'imprime que le contenu du fichier hello.py.

Comment puis-je le réparer?

12
Yura

De le http.server docs :

CGIHTTPRequestHandler peut être activé dans la ligne de commande en passant l'option --cgi:

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

Mettez votre script dans cgi_directories :

La valeur par défaut est ['/cgi-bin', '/htbin'] et décrit les répertoires à traiter comme contenant des scripts CGI.

Ouvrir dans le navigateur:

$ 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>")

Je devais le rendre exécutable sur POSIX: chmod +x cgi-bin/hello.py

13
jfs

Je l'ai fait il y a quelque temps pour 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 __== '__main__':
    from BaseHTTPServer import HTTPServer
    server = HTTPServer(('localhost', 777), GetHandler)
    print 'Starting server, use <Ctrl + F2> to stop'
    server.serve_forever()

Donc, dans Python 3, il vous suffit de modifier les importations

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 __== '__main__':
    from http.server import HTTPServer
    server = HTTPServer(('localhost', 777), GetHandler)
    print('Starting server, use <Ctrl + F2> to stop')
    server.serve_forever()

Je ne sais pas pour le moment si la fonction print de python 3 est 

print("")

ou

print ""

mais je suppose que c'était avec ()

Edit: c'est print ()

2

J'ai créé un exemple complet pour un ami. Il s’agit d’une démo complète que vous pouvez exécuter avec 8 simples lignes de code prêtes à être copiées-collées. Prendre plaisir.

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