服务 WSGI 应用程序 — Werkzeug 文档

来自菜鸟教程
Werkzeug/docs/2.0.x/serving
跳转至:导航、​搜索

服务 WSGI 应用程序

有很多方法可以为 WSGI 应用程序提供服务。 在开发它时,您通常不希望启动并运行像 Apache 这样的成熟网络服务器,而是一个简单的独立服务器。 因此,Werkzeug 带有内置的开发服务器。

最简单的方法是创建一个小的 start-myproject.py 文件,该文件使用内置服务器运行应用程序:

from werkzeug.serving import run_simple
from myproject import make_app

app = make_app(...)
run_simple('localhost', 8080, app, use_reloader=True)

您还可以将 extra_files 关键字参数与您想要观察的附加文件(如配置文件)列表传递给它。

信息

开发服务器不打算在生产系统上使用。 它专为开发目的而设计,在高负载下表现不佳。 有关部署设置,请查看 应用程序部署 页面。


重装器

在 0.10 版中更改。


Werkzeug 重新加载器持续监视 Web 应用程序的模块和路径,并在观察到的任何文件发生更改时重新启动服务器。

从 0.10 版本开始,重新加载器支持两个后端:statwatchdog

  • 默认的 stat 后端只是定期检查所有文件的 mtime。 这对于大多数情况来说已经足够了,但是众所周知,它会耗尽笔记本电脑的电池。
  • watchdog 后端使用文件系统事件,并且比 stat 快得多。 它需要安装 watchdog 模块。 实现此目的的推荐方法是将 Werkzeug[watchdog] 添加到您的需求文件中。

如果 watchdog 已安装并可用,它将自动代替内置的 stat 重载器使用。

要在后端之间切换,您可以使用 run_simple() 函数的 reloader_type 参数。 'stat' 将其设置为默认的基于统计的轮询,而 'watchdog' 将其强制设置为看门狗后端。

笔记

出于性能原因,stat 重新加载器不会处理某些边缘情况,例如无法正确导入的模块。 看门狗重新加载器也监视此类文件。


彩色测井

开发服务器根据状态代码以不同颜色突出显示请求日志。 在 Windows 上,还必须安装 Colorama 才能启用此功能。


虚拟主机

许多 Web 应用程序使用多个子域。 这在本地模拟可能有点棘手。 幸运的是,有 主机文件 可用于为本地计算机分配多个名称。

这允许您调用本地计算机 yourapplication.local 和 api.yourapplication.local(或其他任何东西)以及 localhost。

您可以在以下位置找到 hosts 文件:

视窗 %SystemRoot%\system32\drivers\etc\hosts
Linux / OS X /etc/hosts


您可以使用您喜欢的文本编辑器打开该文件并在 localhost 后添加一个新名称:

127.0.0.1       localhost yourapplication.local api.yourapplication.local

保存更改,一段时间后,您应该也可以访问这些主机名上的开发服务器。 您可以使用URL路由系统在不同主机之间进行调度或自己解析request.host


关闭服务器

在某些情况下,在处理请求后关闭服务器会很有用。 例如,需要 OAuth 身份验证的本地命令行工具可以临时启动服务器以侦听响应,记录用户的令牌,然后停止服务器。

一种方法是在 multiprocessing 进程中启动服务器,然后在将值传递回父进程后终止该进程。

import multiprocessing
from werkzeug import Request, Response, run_simple

def get_token(q: multiprocessing.Queue) -> None:
    @Request.application
    def app(request: Request) -> Response:
        q.put(request.args["token"])
        return Response("", 204)

    run_simple("localhost", 5000, app)

if __name__ == "__main__":
    q = multiprocessing.Queue()
    p = multiprocessing.Process(target=get_token, args=(q,))
    p.start()
    print("waiting")
    token = q.get(block=True)
    p.terminate()
    print(token)

该示例使用 Werkzeug 的开发服务器,但任何可以作为 Python 进程启动的生产服务器都可以使用相同的技术,并且应该优先考虑安全性。 另一种方法可能是启动 subprocess 进程并通过 stdout 将值发送回。

自 2.0 版起已弃用: 不推荐使用 environ["werkzeug.server.shutdown"] 关闭服务器,并将在 Werkzeug 2.1 中删除。


开发服务器提供了一种根据请求关闭服务器的方法。 这仅适用于开发服务器。 开发服务器使用 "werkzeug.server.shutdown" 键将函数注入 WSGI 环境。

def shutdown_server(environ):
    shutdown = environ.get("werkzeug.server.shutdown")

    if shutdown is None:
        raise RuntimeError("Not running the development server.")

    shutdown()

故障排除

在支持 ipv6 并配置了 ipv6 的操作系统上,例如现代 Linux 系统、OS X 10.4 或更高版本以及 Windows Vista,如果访问本地服务器,某些浏览器可能会非常缓慢。 这样做的原因是有时“localhost”被配置为在 ipv4 和 ipv6 套接字上都可用,一些浏览器会尝试先访问 ipv6,然后再访问 ipv4。

目前集成的网络服务器不同时支持 ipv6 和 ipv4,为了更好的可移植性,ipv4 是默认的。

如果您注意到 Web 浏览器加载页面需要很长时间,有两种方法可以解决此问题。 如果您不需要 ipv6 支持,您可以通过删除以下行来禁用 hosts 文件 中的 ipv6 条目:

::1             localhost

或者,您也可以在浏览器中禁用 ipv6 支持。 例如,如果 Firefox 显示此行为,您可以通过转到 about:config 并禁用 network.dns.disableIPv6 键来禁用它。 然而,从 Werkzeug 0.6.1 开始,不推荐这样做!

从 Werkzeug 0.6.1 开始,服务器现在将根据您的操作系统配置在 ipv4 和 ipv6 之间切换。 这意味着如果您在浏览器中禁用了 ipv6 支持,但您的操作系统更喜欢 ipv6,您将无法连接到您的服务器。 在这种情况下,您可以删除 ::1 的 localhost 条目或将主机名显式绑定到 ipv4 地址 (127.0.0.1)


安全证书

0.6 版中的新功能。


内置服务器支持 SSL 以进行测试。 如果提供了 SSL 上下文,则将使用它。 这意味着服务器可以在 HTTP 或 HTTPS 模式下运行,但不能同时运行。

快速入门

使用 Werkzeug 进行基于 SSL 的开发的最简单方法是使用它生成 SSL 证书和私钥并将其存储在某处,然后将其放在那里。 对于证书,您需要提供生成时的服务器名称或 CN。

  1. 生成 SSL 密钥并将其存储在某处:

    >>> from werkzeug.serving import make_ssl_devcert
    >>> make_ssl_devcert('/path/to/the/key', host='localhost')
    ('/path/to/the/key.crt', '/path/to/the/key.key')
  2. 现在这个元组可以作为 ssl_context 传递给 run_simple() 方法:

    run_simple('localhost', 4000, application,
               ssl_context=('/path/to/the/key.crt',
                            '/path/to/the/key.key'))

届时,您必须在浏览器中确认该证书。


手动加载上下文

您可以使用 ssl.SSLContext 对象而不是元组来完全控制 TLS 配置。

import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain('ssl.cert', 'ssl.key')
run_simple('localhost', 4000, application, ssl_context=ctx)

生成证书

可以使用 openssl 工具而不是 make_ssl_devcert() 提前创建密钥和证书。 这需要您在系统上安装 openssl 命令:

$ openssl genrsa 1024 > ssl.key
$ openssl req -new -x509 -nodes -sha1 -days 365 -key ssl.key > ssl.cert

临时证书

启用 SSL 的最简单方法是以 adhoc 模式启动服务器。 在这种情况下,Werkzeug 将为您生成 SSL 证书:

run_simple('localhost', 4000, application,
           ssl_context='adhoc')

当然,这样做的缺点是每次重新加载服务器时都必须确认证书。 不鼓励临时证书,因为出于安全原因,现代浏览器在支持它们方面做得很差。

此功能需要安装加密库。


Unix 套接字

开发服务器可以绑定到 Unix 套接字而不是 TCP 套接字。 如果 hostname 参数以 'unix://' 开头,则 run_simple() 将绑定到 Unix 套接字。

from werkzeug.serving import run_simple
run_simple('unix://example.sock', 0, app)