为WSGI应用程序提供服务

为WSGI应用程序提供服务的方法有很多。在开发它的过程中,您通常不希望有一个像Apache这样全面的Web服务器,而是一个简单的独立服务器。因此,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 关键字参数,包含要观察的其他文件(如配置文件)的列表。

werkzeug.serving.run_simple(hostname, port, application, use_reloader=False, use_debugger=False, use_evalex=True, extra_files=None, exclude_patterns=None, reloader_interval=1, reloader_type='auto', threaded=False, processes=1, request_handler=None, static_files=None, passthrough_errors=False, ssl_context=None)

启动WSGI应用程序的开发服务器。可以启用各种可选功能。

警告

部署到生产环境时,请不要使用开发服务器。它仅供在当地开发期间使用。它不是被设计成特别高效、稳定或安全的。

参数:
  • hostname (str) -- 例如,要绑定到的主机 'localhost' 。可以是域、IPv4或IPv6地址,也可以是以 unix:// 对于Unix套接字。

  • port (int) -- 例如,要绑定到的端口 8080 。使用 0 告知操作系统选择一个随机的空闲端口。

  • application (WSGIApplication) -- 要运行的WSGI应用程序。

  • use_reloader (bool) -- 当文件发生更改时,使用重新加载程序进程重新启动服务器进程。

  • use_debugger (bool) -- 使用Werkzeug的调试器,它将显示未处理异常的格式化回溯。

  • use_evalex (bool) -- 使调试器具有交互功能。可以为回溯中的任何帧打开Python终端。需要PIN可以提供一些保护,但绝不应在公开可见的服务器上启用PIN。

  • extra_files (t.Iterable[str] | None) -- 重新加载器将监视这些文件,以查找除Python模块之外的更改。例如,查看配置文件。

  • exclude_patterns (t.Iterable[str] | None) -- 重新加载程序将忽略对匹配这些文件的任何文件所做的更改 fnmatch 模式。例如,忽略缓存文件。

  • reloader_interval (int) -- 重新加载程序尝试检查更改的频率。

  • reloader_type (str) -- 要使用的重新加载器。这个 'stat' 重载程序是内置的,但可能需要大量的CPU来查看文件。这个 'watchdog' 重载程序的效率要高得多,但需要安装 watchdog 请先打包。

  • threaded (bool) -- 使用线程处理并发请求。不能与一起使用 processes

  • processes (int) -- 最多使用此数量的进程处理并发请求。不能与一起使用 threaded

  • request_handler (type[WSGIRequestHandler] | None) -- 使用不同的 BaseHTTPRequestHandler 子类来处理请求。

  • static_files (dict[str, str | tuple[str, str]] | None) -- DICT将URL前缀映射到目录,以提供静态文件 SharedDataMiddleware

  • passthrough_errors (bool) -- 不要在服务器级别捕获未处理的异常,而是让服务器崩溃。如果 use_debugger 则调试器仍将捕获此类错误。

  • ssl_context (_TSSLContextArg | None) -- 将TLS配置为通过HTTPS提供服务。可以是一个 ssl.SSLContext 对象,则一个 (cert_file, key_file) 用于创建典型上下文的元组,或字符串 'adhoc' 以生成临时自签名证书。

返回类型:

None

Changelog

在 2.1 版本发生变更: 显示了处理“地址已在使用”错误的说明。

在 2.1 版本发生变更: 运行于 0.0.0.0:: 除显示真实IP外,还显示环回IP。

在 2.1 版本发生变更: 命令行界面已删除。

在 2.0 版本发生变更: 运行于 0.0.0.0:: 显示了绑定的真实IP地址以及不要在生产环境中运行开发服务器的警告。

在 2.0 版本发生变更: 这个 exclude_patterns 参数已添加。

在 0.15 版本发生变更: 通过向Unix套接字传递 hostname 一开始就是这样 unix://

在 0.10 版本发生变更: 改进了重新加载器,并添加了对通过 reloader_type 参数。

在 0.9 版本发生变更: 添加了一个命令行界面。

在 0.8 版本发生变更: ssl_context 可以是证书和私钥文件的路径元组。

在 0.6 版本发生变更: 这个 ssl_context 参数已添加。

在 0.5 版本发生变更: 这个 static_filespassthrough_errors 添加了参数。

werkzeug.serving.is_running_from_reloader()

检查服务器是否在Werkzeug重新加载程序中作为子进程运行。

Changelog

在 0.10 版本加入.

返回类型:

bool

werkzeug.serving.make_ssl_devcert(base_path, host=None, cn=None)

为开发创建一个SSL密钥。应该使用这个而不是 'adhoc' 在每个服务器启动时生成新证书的密钥。它接受存储密钥和证书以及主机或CN的路径。如果提供主机,它将使用cn *.host/CN=host .

有关详细信息,请参阅 run_simple() .

Changelog

在 0.9 版本加入.

参数:
  • base_path (str) -- 证书和密钥的路径。扩展 .crt 为证书添加, .key 为键添加。

  • host (str | None) -- 主机的名称。这可以作为 cn .

  • cn (str | None) -- 这个 CN 使用。

返回类型:

tuple[str, str]

问询处

开发服务器不用于生产系统。它是专门为开发而设计的,在高负载下性能较差。对于部署设置,请查看 部署到生产环境 页。

重新加载

Changelog

在 0.10 版本发生变更.

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

从0.10版开始,重载支持两个后端: statwatchdog .

  • 默认值 stat 后端只检查 mtime 以固定的时间间隔保存所有文件。然而,这对于大多数情况来说已经足够了,因为它会耗尽笔记本电脑的电池。

  • 这个 watchdog 后端使用文件系统事件,并且比 stat .它需要 watchdog 要安装的模块。实现这一点的建议方法是 Werkzeug[watchdog] 到您的需求文件。

如果 watchdog 已安装并可用它将自动使用而不是内置 stat 重新加载。

要在后端之间切换,可以使用 reloader_type 的参数 run_simple() 功能。 'stat' 将其设置为默认的基于stat的轮询和 'watchdog' 将其强制到监视程序后端。

备注

由于性能原因,某些边缘情况(如模块未能正确导入)不会由stat重载程序处理。监视程序重载程序也监视这些文件。

彩色日志

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

虚拟主机

许多Web应用程序使用多个子域。在本地模拟可能有点困难。幸运的是 hosts file 可用于为本地计算机分配多个名称。

这允许您调用本地计算机 yourapplication.localapi.yourapplication.local (或其他)除了 localhost .

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

Windows

%SystemRoot%\system32\drivers\etc\hosts

Linux/OS X

/etc/hosts

您可以使用最喜爱的文本编辑器打开文件,然后在文件后面添加一个新名称。 localhost ::

127.0.0.1       localhost yourapplication.local api.yourapplication.local

保存更改,一段时间后,您还应该能够访问这些主机名上的开发服务器。您可以使用 路径选择 在不同主机之间调度或解析的系统 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

故障排除

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

目前,集成的Web服务器不同时支持IPv6和IPv4,并且为了更好的可移植性,默认为IPv4。

如果您注意到Web浏览器需要很长时间来加载页面,有两种方法可以解决这个问题。如果不需要IPv6支持,可以在 hosts file 删除此行:

::1             localhost

或者,您也可以在浏览器中禁用IPv6支持。例如,如果火狐显示这种行为,您可以通过 about:config 并禁用 network.dns.disableIPv6 键。但是,自Werkzeug 0.6.1起不建议这样做!

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

SSL

Changelog

在 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_contextrun_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的最简单方法是以临时模式启动服务器。在这种情况下,Werkzeug将为您生成一个SSL证书:

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

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

此功能要求安装加密库。

Unix套接字

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

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