J'ai une connexion VPN et lorsque j'exécute python -m SimpleHTTPServer, il sert sur 0.0.0.0:8000, ce qui signifie qu'il est accessible via localhost et via mon IP réel. Je ne veux pas que les robots me scannent et je suis intéressé par le fait que le serveur ne sera accessible que via localhost.
C'est possible?
python -m SimpleHTTPServer 127.0.0.1:8000 # doesn't work.
Tout autre serveur http simple qui peut être exécuté instantanément en utilisant la ligne de commande est également le bienvenu.
python
http
command-line
python-2.x
simplehttpserver
user1639431
la source
la source
http.server
permet la liaison tout de suite, par exemple ,python3 -m http.server --bind 127.0.0.1 8000
il suffiraitSimpleHTTPServer
est mono-thread et bloquant, ce qui signifie que vous ne pourrez pas faire une autre requête tant que la requête précédente n'est pas terminée. Et il n'a pas de support de plage, par exemple pour le streaming / la recherche d'un fichier multimédia à partir d'une position spécifique. Une meilleure alternative esttwisted
(pip install twisted
) avec laquelle vous pouvez exécutertwistd -n web --path /
. Il peut également faire du FTP anonyme avectwistd -n ftp -p 2121 -r /
. Plus de one-liners de serveur http: gist.github.com/willurd/5720255 .Réponses:
Si vous lisez la source, vous verrez que seul le port peut être remplacé sur la ligne de commande. Si vous souhaitez modifier l'hôte sur lequel il est servi, vous devrez implémenter la
test()
méthode deSimpleHTTPServer
etBaseHTTPServer
vous - même. Mais cela devrait être vraiment facile.Voici comment vous pouvez le faire assez facilement:
import sys from SimpleHTTPServer import SimpleHTTPRequestHandler import BaseHTTPServer def test(HandlerClass=SimpleHTTPRequestHandler, ServerClass=BaseHTTPServer.HTTPServer): protocol = "HTTP/1.0" host = '' port = 8000 if len(sys.argv) > 1: arg = sys.argv[1] if ':' in arg: host, port = arg.split(':') port = int(port) else: try: port = int(sys.argv[1]) except: host = sys.argv[1] server_address = (host, port) HandlerClass.protocol_version = protocol httpd = ServerClass(server_address, HandlerClass) sa = httpd.socket.getsockname() print "Serving HTTP on", sa[0], "port", sa[1], "..." httpd.serve_forever() if __name__ == "__main__": test()
Et pour l'utiliser:
> python server.py 127.0.0.1 Serving HTTP on 127.0.0.1 port 8000 ... > python server.py 127.0.0.1:9000 Serving HTTP on 127.0.0.1 port 9000 ... > python server.py 8080 Serving HTTP on 0.0.0.0 port 8080 ...
la source
Dans les versions 3.4 et supérieures de Python, le
http.server
module accepte unbind
paramètre.Selon la documentation :
la source
Comme @sberry l'a expliqué, il
python -m ...
ne sera pas possible de le faire simplement en utilisant la méthode nice , car l'adresse IP est codée en dur dans l'implémentation de laBaseHttpServer.test
fonction.Une façon de le faire à partir de la ligne de commande sans écrire d'abord de code dans un fichier serait
python -c 'import BaseHTTPServer as bhs, SimpleHTTPServer as shs; bhs.HTTPServer(("127.0.0.1", 8888), shs.SimpleHTTPRequestHandler).serve_forever()'
Si cela compte toujours comme une seule ligne dépend de la largeur de votre terminal ;-) Ce n'est certainement pas très facile à retenir.
la source
H
. Merci! - gist.github.com/cmawhorter/f2a09bcf63c68b0cff10python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()"
Notez le changement de devis et le fait que Base et Simple HTTP Server sont maintenant dans http.server.