# 在服务器运行 WSGI 应用
这里有一些在服务器运行 WSGI 应用的方式。当你正在开发一个应用,你往往不想在一个成熟服务器上部署和运行,取而代之的是一个轻量服务器。 Werkzeug 就内置了这样一个轻量的服务器。
在一个服务器上运行 start-myproject.py 最简单的方法如下示例:
~~~
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from werkzeug.serving import run_simple
from myproject import make_app
app = make_app(...)
run_simple('localhost', 8080, app, use_reloader=True)
~~~
你可以添加一个 extra_files 关键字参数,一个你想要添加的文件(比如配置文件)列表。
serving.run_simple(*hostname*, *port*, *application*, *use_reloader=False*, *use_debugger=False*, *use_evalex=True*, *extra_files=None*, *reloader_interval=1*, *threaded=False*, *processes=1*, *request_handler=None*, *static_files=None*, *passthrough_errors=False*, *ssl_context=None*)
用 wsgiref 带可选参数 reloader 运行一个应用,通过包裹 wsgiref 来改正多线程 WSGI的默认的错误报告,添加可选的多线程,支持 fork。
这个函数也有一个命令行接口:
~~~
python -m werkzeug.serving --help
~~~
0.5 新版功能: 通过添加 static_files 简单支持静态文件和 passthrough_errors。
0.6 新版功能: 支持添加 SSL。
0.8 新版功能: 添加支持从 certificate 自动加载 SSL 上下文和私钥。file and private key.
0.9 新版功能: 添加命令行接口。
<table class="docutils field-list" frame="void" rules="none"><col class="field-name"/><col class="field-body"/><tbody valign="top"><tr class="field-odd field"><th class="field-name">参数:</th><td class="field-body"><ul class="first last simple"><li><strong>hostname</strong> – 应用的服务器。例子: <tt class="docutils literal"><span class="pre">'localhost'</span></tt>。</li><li><strong>port</strong> – 服务器接口。 例子: <tt class="docutils literal"><span class="pre">8080</span></tt></li><li><strong>application</strong> – 要执行的 WSGI 应用。</li><li><strong>use_reloader</strong> – 当模块更改是否自动重启 python 进程?</li><li><strong>use_debugger</strong> – 是否开启 werkzeug 调试?</li><li><strong>use_evalex</strong> – 是否开启异常诊断功能?</li><li><strong>extra_files</strong> – 模块可以加载的件列表。比如配置文件。</li><li><strong>reloader_interval</strong> – 加载的时间间隔。</li><li><strong>threaded</strong> – 每个请求是否被放在一个独立线程?</li><li><strong>processes</strong> – 请求处理线程的最大个数。</li><li><strong>request_handler</strong> – 用于替换默认的可选参数。你可以用一个不同的<tt class="xref py py-class docutils literal"><span class="pre">BaseHTTPRequestHandler</span></tt>子类替换它。</li><li><strong>static_files</strong> – 一个静态文件地址的字典。和 <tt class="xref py py-class docutils literal"><span class="pre">SharedDataMiddleware</span></tt>差不多。它实际上仅仅是在服务器运行前用中间件包裹一个应用。</li><li><strong>passthrough_errors</strong> – 设为 <cite>True</cite> 关闭错误捕获。这意味着服务可能会因错误而崩溃,但是对于调试钩子很有用 (比如pdb)。</li><li><strong>ssl_context</strong> – 连接的 SSL 上下文。或者一个 OpenSSL 上下文,从<tt class="docutils literal"><span class="pre">(cert_file,</span> <span class="pre">pkey_file)</span></tt> 得到的一个元组,服务是 <tt class="docutils literal"><span class="pre">'adhoc'</span></tt> 的则会自动创建一个,如果是 <cite>None</cite> 则会关闭 SSL(这是默认的)。</li></ul></td></tr></tbody></table>
serving.make_ssl_devcert(*base_path*, *host=None*, *cn=None*)
创建一个 SSL 密钥。用于代替 'adhoc' 密钥将会在服务启动的时候创建一个新的证书。他接受一个存放密钥、证书和主机或 CN 的路径。如果主机拥有这个将会使用 CN *.host/CN=host。
更多信息请看 [run_simple()](# "serving.run_simple")。
0.9 新版功能.
| 参数: | **base_path** – 证书和密钥的路径。扩展名是 .crt 的文件被添加到证书,扩 |
|-----|-----|
展名为 .key 的文件被添加到密钥。:param host: 主机的名字。这个用于替代 cn。:param cn: 使用 CN。
Information
开发服务器不是为了生产环境,它的出现是为了开发方便,在高负载情况下效率是很低的。生产环境部署一个应用请看 [*Application Deployment*](#) 页面。
### 虚拟主机
一些应用有多个子域名,你需要模拟本地。幸运的是 [hosts file](http://en.wikipedia.org/wiki/Hosts_file) 文件可以给本机分配多个名字。
这允许你使用 yourapplication.local 和 api.yourapplication.local (或者其他)代替 localhost 访问本机。
你可以从下面的地方找到 hosts 文件:
>
| Windows | %SystemRoot%\system32\drivers\etc\hosts |
|-----|-----|
| Linux / OS X | /etc/hosts |
你可以用你喜欢的文本编辑器打开 hosts 文件,在 localhost 后面加上:
~~~
127.0.0.1 localhost yourapplication.local api.yourapplication.local
~~~
保存之后你应该就可以通过你添加的主机名字访问开发服务器了。你可以使用[*URL Routing*](#) 系统调度”两个”主机或自己解析 request.host 。
### 关闭服务
0.7 新版功能.
从 Werkzeug 0.7 版本开始,开发服务器允许在一个请求后关闭服务。目前要求你的Python版本在 2.6 以上,同时也只能在开发服务器启用。通过在 WSGI 环境调用'erkzeug.server.shutdown' 来开启 shutdown:
~~~
def shutdown_server(environ):
if not 'werkzeug.server.shutdown' in environ:
raise RuntimeError('Not running the development server')
environ['werkzeug.server.shutdown']()
~~~
### 故障排除
在一些支持并配置 ipv6 的操作系统,比如 Linux, OS X 10.4 或更高 和 Windows Vista一些浏览器有时候访问本地服务器很慢,原因有可能是本机被设置为同时支持 ipv4 和ipv6 套接字,一些浏览器会首先尝试 ipv6 协议。
而目前集成的服务器不能同时支持两种协议。为了更好的可移植性,将会默认支持 ipv4协议。
注意到解决这个问题有两种方法。如果你不需要ipv6 支持,你可以移除 [hosts file](http://en.wikipedia.org/wiki/Hosts_file) 文件中的下面一行:
~~~
::1 localhost
~~~
另外你也可以关闭浏览器的 ipv6 支持。比如,在火狐浏览器中你可以进入about:config 关闭 network.dns.disableIPv6 。然后,在 werkzeug 0.6.1中不推荐这种做法。
从 Werkzeug 0.6.1 开始服务器将不再根据操作系统的配置来转换协议。这意味着如果你的浏览器关闭 ipv6 支持,而你的操作系统更倾向于 ipv6,你将连接不上服务器。这种情况下,你可以移除本机 hosts 文件的 ::1 或者明确的用一个 ipv4 协议地址(127.0.0.1)绑定主机名。
### SSL
0.6 新版功能.
内置服务器支持测试目的的 SSL,如果提供一个 SSL上下文,他将会被使用,这意味着服务器可以在 HTTP 或 HTTPS 模式下运行,但不可同时在两种模式下运行。这个功能需要Python OpenSSL 库。
### 快速开始
在werkzeug开发过程中使用 SSL 最简单的方法就是通过 werkzeug 生成一个 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')
~~~
1.
现在这个元组会当作 ssl_context 传入 [run_simple()](# "serving.run_simple") 方法:
run_simple(‘localhost', 4000, application,ssl_context=(‘/path/to/the/key.crt',
‘/path/to/the/key.key'))
现在当你通过浏览器访问 web 应用的时候将需要验证证书。
### 手动加载上下文
你也可以通过代码创建一个上下文代替使用 ssl_context 元组。这个方法是更好控制的:
~~~
from OpenSSL import SSL
ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.use_privatekey_file('ssl.key')
ctx.use_certificate_file('ssl.cert')
run_simple('localhost', 4000, application, ssl_context=ctx)
~~~
### 生成证书
使用 openssl 工具代替 [make_ssl_devcert()](# "serving.make_ssl_devcert") 预先创建一个证书。这要求你的系统安装 openssl 命令行工具:
~~~
$ openssl genrsa 1024 > ssl.key
$ openssl req -new -x509 -nodes -sha1 -days 365 -key ssl.key > ssl.cert
~~~
### Adhoc 证书
开启 SSL 最简单的方法就是用 adhoc 模式运行服务。在这个例子中 Werkzeug 将会为你创建一个证书:
~~~
run_simple('localhost', 4000, application,
ssl_context='adhoc')
~~~
当然这种方法也有缺点,那就是每次重载服务你都需要验证证书。不推荐 Adhoc 证书因为现在的浏览器因为安全原因对他们支持并不好。
- 开始
- Werkzeug 文档概览
- 安装
- 过渡到 Werkzeug 1.0
- Werkzeug 教程
- API 标准
- 快速开始
- Python 3 Notes
- 服务和测试
- Debugging Applications
- 在服务器运行 WSGI 应用
- 单元测试
- 参考
- Request / Response Objects
- URL Routing
- WSGI Helpers
- HTTP Utilities
- Data Structures
- Utilities
- Context Locals
- Middlewares
- HTTP Exceptions
- 部署
- CGI
- mod_wsgi (Apache)
- FastCGI
- HTTP Proxying
- 贡献模块
- Atom Syndication
- Sessions
- Secure Cookie
- Cache
- Extra Wrappers
- Iter IO
- Fixers
- WSGI Application Profiler
- Lint Validation Middleware
- 额外说明
- Werkzeug Changelog
- Important Terms
- Unicode
- Dealing with Request Data