У меня есть vpn-соединение, и когда я запускаю python -m SimpleHTTPServer, он обслуживает 0.0.0.0:8000, что означает, что к нему можно получить доступ через localhost и через мой настоящий ip. Я не хочу, чтобы роботы меня сканировали, и мне было интересно, что доступ к серверу будет только через localhost.
Является ли это возможным?
python -m SimpleHTTPServer 127.0.0.1:8000 # doesn't work.
Также приветствуется любой другой простой http-сервер, который может быть запущен мгновенно из командной строки.
python
http
command-line
python-2.x
simplehttpserver
user1639431
источник
источник
http.server
разрешает привязку сразу, например,python3 -m http.server --bind 127.0.0.1 8000
будет достаточноSimpleHTTPServer
однопоточное и блокирующее, что означает, что вы не сможете выполнить другой запрос, пока не завершится предыдущий. И у него нет поддержки диапазона, например, для потоковой передачи / поиска мультимедийного файла из определенной позиции. Лучшая альтернатива -twisted
(pip install twisted
), с которой вы можете работатьtwistd -n web --path /
. Он также может выполнять анонимный FTP сtwistd -n ftp -p 2121 -r /
. Дополнительные однострочные сообщения http-сервера: gist.github.com/willurd/5720255 .Ответы:
Если вы прочтете исходный код, вы увидите, что только порт можно переопределить в командной строке. Если вы хотите изменить хост, на котором он обслуживается, вам нужно будет реализовать
test()
методSimpleHTTPServer
иBaseHTTPServer
самостоятельно. Но это должно быть очень просто.Вот как это довольно легко сделать:
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()
И использовать это:
> 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 ...
источник
В версиях Python 3.4 и выше
http.server
модуль принимаетbind
параметр.Согласно документам :
источник
Как объяснил @sberry , просто сделать это с помощью
python -m ...
метода nice невозможно, потому что IP-адрес жестко запрограммирован в реализацииBaseHttpServer.test
функции.Способ сделать это из командной строки без предварительной записи кода в файл был бы
python -c 'import BaseHTTPServer as bhs, SimpleHTTPServer as shs; bhs.HTTPServer(("127.0.0.1", 8888), shs.SimpleHTTPRequestHandler).serve_forever()'
Если это все еще считается одним лайнером, это зависит от ширины вашего терминала ;-) Это, конечно, не очень легко запомнить.
источник
H
. Благодарность! - gist.github.com/cmawhorter/f2a09bcf63c68b0cff10python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()"
Обратите внимание на изменение цитаты и тот факт, что базовый и простой HTTP-сервер теперь находятся на http.server.