为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_files
和passthrough_errors
添加了参数。
- werkzeug.serving.is_running_from_reloader()¶
检查服务器是否在Werkzeug重新加载程序中作为子进程运行。
Changelog
在 0.10 版本加入.
- 返回类型:
- werkzeug.serving.make_ssl_devcert(base_path, host=None, cn=None)¶
为开发创建一个SSL密钥。应该使用这个而不是
'adhoc'
在每个服务器启动时生成新证书的密钥。它接受存储密钥和证书以及主机或CN的路径。如果提供主机,它将使用cn*.host/CN=host
.有关详细信息,请参阅
run_simple()
.Changelog
在 0.9 版本加入.
问询处
开发服务器不用于生产系统。它是专门为开发而设计的,在高负载下性能较差。对于部署设置,请查看 部署到生产环境 页。
重新加载¶
Changelog
在 0.10 版本发生变更.
Werkzeug重载程序不断监视Web应用程序的模块和路径,并在观察到的任何文件发生更改时重新启动服务器。
从0.10版开始,重载支持两个后端: stat
和 watchdog
.
默认值
stat
后端只检查mtime
以固定的时间间隔保存所有文件。然而,这对于大多数情况来说已经足够了,因为它会耗尽笔记本电脑的电池。这个
watchdog
后端使用文件系统事件,并且比stat
.它需要 watchdog 要安装的模块。实现这一点的建议方法是Werkzeug[watchdog]
到您的需求文件。
如果 watchdog
已安装并可用它将自动使用而不是内置 stat
重新加载。
要在后端之间切换,可以使用 reloader_type 的参数 run_simple()
功能。 'stat'
将其设置为默认的基于stat的轮询和 'watchdog'
将其强制到监视程序后端。
备注
由于性能原因,某些边缘情况(如模块未能正确导入)不会由stat重载程序处理。监视程序重载程序也监视这些文件。
彩色日志¶
开发服务器根据状态代码以不同的颜色突出显示请求日志。在Windows上, Colorama 还必须安装才能启用此功能。
虚拟主机¶
许多Web应用程序使用多个子域。在本地模拟可能有点困难。幸运的是 hosts file 可用于为本地计算机分配多个名称。
这允许您调用本地计算机 yourapplication.local 和 api.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 .
生成一个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')
现在这个元组可以作为
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的最简单方法是以临时模式启动服务器。在这种情况下,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)