简单的 Python HTTP(S) 服务器 -- 示例
标准 Python 库有一个内置模块,可用作简约的 HTTP/HTTPS Web 服务器。它提供对协议的支持,并允许您通过子类化来扩展功能。
在许多现实生活中,向外界提供静态 HTML/CSS 文件非常有用和方便。例如,要显示您创建的客户端 HTML 页面或通过创建静态文件存根 API。
静态 HTTP Web 服务器示例
静态 Web 服务器的另一个目的是通过创建 json 或/和 xml 文件来创建虚拟 API。子文件夹中组织的资源结构将提供类似 RESTful 的 URL。例如 /users/all.json.json 可能包含用户的虚拟记录。这种方法甚至比创建 Flask 应用程序更快。无需数据库,适用于任何地方。从远程服务器下载数据。假设 scp 命令存在一些困难。可以在远程机器上运行简单的服务器并通过 HTTP 下载必要的内容。
蟒蛇 3.X
python3 -m http.server 8000 --bind 127.0.0.1
端口和绑定地址都是可选的。更多详情,请阅读 官方文档。
蟒蛇 2.X
python -m SimpleHTTPServer 8000
Python 2.x 只能接受端口作为参数绑定地址参数不可用。 Python 2.x 文档。
在这两种情况下,当前文件夹的内容都可以通过http://127.0.0.1:8000访问
支持 SSL 的示例
要运行安全的 HTTPS 服务器,请创建以下模块:
Python 3.X
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl
httpd = HTTPServer(('localhost', 4443), BaseHTTPRequestHandler)
httpd.socket = ssl.wrap_socket (httpd.socket,
keyfile="path/to/key.pem",
certfile='path/to/cert.pem', server_side=True)
httpd.serve_forever()
Python 2.X
import BaseHTTPServer, SimpleHTTPServer
import ssl
httpd = BaseHTTPServer.HTTPServer(('localhost', 4443),
SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket (httpd.socket,
keyfile="path/tp/key.pem",
certfile='path/to/cert.pem', server_side=True)
httpd.serve_forever()
要使用 OpenSSL 生成密钥和证书文件,请使用以下命令
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
更多示例将假设 Python 3.5+ 作为解释器。
高级 Python HTTP 服务器
让我们通过处理请求使我们的 Web 服务器更先进一点。
Do_GET
考虑以下代码:
from http.server import HTTPServer, BaseHTTPRequestHandler
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b'Hello, world!')
httpd = HTTPServer(('localhost', 8000), SimpleHTTPRequestHandler)
httpd.serve_forever()
这是一个非常简单的 HTTP 服务器,它响应Hello, world! 给请求者。请注意,self.send_response(200)
和 self.end_headers()
是强制性的,否则响应将不被视为有效。我们可以通过使用HTTPie发送请求来检查它是否确实有效:
$ http http://127.0.0.1:8000
HTTP/1.0 200 OK
Date: Sun, 25 Feb 2018 17:26:20 GMT
Server: BaseHTTP/0.6 Python/3.6.1
Hello, world!
请注意,这self.wfile
是一个类似文件的对象,因此该write
函数需要一个类似字节的对象。另一种提供BytesIO 对象的方法wfile
是使用BytesIO对象(请参见下面的示例)。
做_POST
现在让我们处理一个 POST 请求。完整示例:
from http.server import HTTPServer, BaseHTTPRequestHandler
from io import BytesIO
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b'Hello, world!')
def do_POST(self):
content_length = int(self.headers['Content-Length'])
body = self.rfile.read(content_length)
self.send_response(200)
self.end_headers()
response = BytesIO()
response.write(b'This is POST request. ')
response.write(b'Received: ')
response.write(body)
self.wfile.write(response.getvalue())
httpd = HTTPServer(('localhost', 8000), SimpleHTTPRequestHandler)
httpd.serve_forever()
可以通过访问请求正文self.rfile
。它是一个BufferedReader, 因此read([size])
应该执行方法以获取内容。请注意,size
应该明确地传递给函数,否则请求将挂起并且永远不会结束。
这就是为什么获得content_length
是必要的。它可以通过检索self.headers
并转换为整数。上面的示例只是打印回他收到的任何内容,如下所示:
http http://127.0.0.1:8000 key=value
HTTP/1.0 200 OK
Date: Sun, 25 Feb 2018 17:46:06 GMT
Server: BaseHTTP/0.6 Python/3.6.1
This is POST request. Received: {"key": "value"}
如果您愿意,您可以考虑解析 JSON。
Twisted 作为一个简单的 Web HTTP(S) 服务器
Web 服务器的另一个很好的例子是 Twisted。显然,它比 Python 内置的要快得多,并且提供了许多开箱即用的功能。它支持 SSL,无需编写一行代码。它支持 Python 3.x 和 2.x。
安装
pip install twisted
用法
运行一个 Twisted 作为 Web 服务器来为当前目录提供服务:
twistd -no web --path
您将看到如下输出:
(.venv) andrey@work$ ~/Projects/test_app twistd -no web --path=.
2016-10-23T19:05:02+0300 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 16.4.1 (/Users/andrey/Projects/anvileight/.venv/bin/python3.5 3.5.1) starting up.
2016-10-23T19:05:02+0300 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.selectreactor.SelectReactor.
2016-10-23T19:05:02+0300 [-] Site starting on 8080
2016-10-23T19:05:02+0300 [twisted.web.server.Site#info] Starting factory <twisted.web.server.Site object at 0x110b96c50>
选项
-n , –nodaemon 不要守护进程,不要使用默认的 umask 0077
-o , –no_save 在关机时不保存状态
–path=是要设置为 Web 服务器根目录的特定文件或目录。如果您有一个充满 HTML、cgi、epy 或 rpy 文件或任何其他您想要的文件的目录,请使用此选项
命令
web可以从文件系统或应用程序资源提供服务的通用 Web 服务器。
如果您正在寻找 HTTPS 和 SSL 支持,请考虑以下选项:
–https=侦听安全 HTTP 的端口。
-c, –certificate=用于 HTTPS 的 SSL 证书。[默认:server.pem]
-k, –privkey=用于 HTTPS 的 SSL 证书。[默认:server.pem]
Docker 示例
这是我用来向外界提供简单 html 页面的 Dockerfile 示例。
FROM python:3.5
VOLUME ["/code"]
ADD . /code
WORKDIR /code
EXPOSE 5000
CMD ["python", "-m", "http.server", "5000"]
可以编写自定义处理程序并扩展基本功能。包括创建HTTPS服务器等。找到python 3 http服务器的官方文档在这里。Python 2 文档在这里
- 点赞
- 收藏
- 关注作者
评论(0)