简单的 Python HTTP(S) 服务器 -- 示例

举报
Tiamo_T 发表于 2021/11/25 13:13:49 2021/11/25
【摘要】 标准 Python 库有一个内置模块,可用作简约的 HTTP/HTTPS Web 服务器。它提供对协议的支持,并允许您通过子类化来扩展功能。

标准 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 文档在这里

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。