是否可以仅在本地主机上运行 python SimpleHTTPServer?
Posted
技术标签:
【中文标题】是否可以仅在本地主机上运行 python SimpleHTTPServer?【英文标题】:Is it possible to run python SimpleHTTPServer on localhost only? 【发布时间】:2012-08-29 10:17:46 【问题描述】:我有一个 *** 连接,当我运行 python -m SimpleHTTPServer 时,它在 0.0.0.0:8000 上提供服务,这意味着它可以通过本地主机和通过我的真实 ip 访问。 我不希望机器人扫描我,并且对只能通过 localhost 访问服务器感兴趣。
有可能吗?
python -m SimpleHTTPServer 127.0.0.1:8000 # doesn't work.
也欢迎任何其他可以使用命令行立即执行的简单 http 服务器。
【问题讨论】:
您可以简单地阻止防火墙/路由器在该端口上的外部连接。 虽然对 python2 来说是一个很好的问题,但这里可能需要注意的是,在 python3 中,替换http.server
允许立即绑定,例如 python3 -m http.server --bind 127.0.0.1 8000
就足够了
旁注:SimpleHTTPServer
是单线程和阻塞的,这意味着在前一个请求结束之前您将无法执行另一个请求。它没有范围支持,例如用于从特定位置流式传输/查找媒体文件。更好的选择是twisted
(pip install twisted
),您可以使用twistd -n web --path /
运行它。它还可以使用twistd -n ftp -p 2121 -r /
进行匿名FTP。更多http服务器单行:gist.github.com/willurd/5720255.
【参考方案1】:
如果您阅读源代码,您会发现只有端口可以在命令行上被覆盖。如果你想改变它所服务的主机,你需要自己实现SimpleHTTPServer
和BaseHTTPServer
的test()
方法。但这应该很容易。
你可以这样做,很容易:
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 ...
【讨论】:
【参考方案2】:正如 @sberry 解释的那样,简单地使用漂亮的 python -m ...
方法是不可能的,因为 IP 地址在 BaseHttpServer.test
函数的实现中是硬编码的。
在不先将代码写入文件的情况下从命令行执行此操作的方法是
python -c 'import BaseHTTPServer as bhs, SimpleHTTPServer as shs; bhs.HTTPServer(("127.0.0.1", 8888), shs.SimpleHTTPRequestHandler).serve_forever()'
如果这仍然算作一个衬里取决于您的终端宽度;-) 这当然不是很容易记住。
【讨论】:
将此添加到 .bash_profile。嗯。现在我可以输入H
。谢谢! -- gist.github.com/cmawhorter/f2a09bcf63c68b0cff10
要在 Windows 10 上使用 Python 3.5.1 作为一个简单的 http 服务器,我必须将其更改如下:python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()"
请注意报价的变化以及 Base 和 Simple HTTP Server 的事实现在在 http.server 中。
+1 在使用配置文件别名时,我称我的为“servelocal”——为了让 bash 语法更快乐,有一些舞蹈改变和转义引号,但结果很好。
非常有帮助... :)
完美运行!只有一个问题 - 我怎样才能指向其他位置的路径?我想创建一个脚本来启动两台服务器...【参考方案3】:
在 Python 3.4 及更高版本中,http.server
模块接受 bind
参数。
根据to the docs:
python -m http.server 8000
默认情况下,服务器将自己绑定到所有接口。选项 -b/--bind 指定它应该绑定的特定地址。例如,以下命令使服务器绑定到 localhost 仅:
python -m http.server 8000 --bind 127.0.0.1
3.4 版中的新功能:引入了 --bind 参数。
【讨论】:
以上是关于是否可以仅在本地主机上运行 python SimpleHTTPServer?的主要内容,如果未能解决你的问题,请参考以下文章