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?
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
où 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
.
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 ()
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)