這里有一些在服務(wù)器運(yùn)行 WSGI 應(yīng)用的方式。當(dāng)你正在開發(fā)一個(gè)應(yīng)用,你往往不想在一個(gè)成熟服務(wù)器上部署和運(yùn)行,取而代之的是一個(gè)輕量服務(wù)器。 Werkzeug 就內(nèi)置了這樣一個(gè)輕量的服務(wù)器。
在一個(gè)服務(wù)器上運(yùn)行 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)
你可以添加一個(gè) extra_files 關(guān)鍵字參數(shù),一個(gè)你想要添加的文件(比如配置文件)列表。
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 帶可選參數(shù) reloader 運(yùn)行一個(gè)應(yīng)用,通過包裹 wsgiref 來改正多線程 WSGI的默認(rèn)的錯(cuò)誤報(bào)告,添加可選的多線程,支持 fork。
這個(gè)函數(shù)也有一個(gè)命令行接口:
python -m werkzeug.serving --help
0.5 新版功能: 通過添加 static_files 簡單支持靜態(tài)文件和 passthrough_errors。
0.6 新版功能: 支持添加 SSL。
0.8 新版功能: 添加支持從 certificate 自動(dòng)加載 SSL 上下文和私鑰。file and private key.
0.9 新版功能: 添加命令行接口。
參數(shù): |
|
---|
serving.make_ssl_devcert(base_path, host=None, cn=None)
創(chuàng)建一個(gè) SSL 密鑰。用于代替 'adhoc' 密鑰將會(huì)在服務(wù)啟動(dòng)的時(shí)候創(chuàng)建一個(gè)新的證書。他接受一個(gè)存放密鑰、證書和主機(jī)或 CN 的路徑。如果主機(jī)擁有這個(gè)將會(huì)使用 CN *.host/CN=host。
更多信息請看 run_simple()。
0.9 新版功能.
展名為 .key 的文件被添加到密鑰。:param host: 主機(jī)的名字。這個(gè)用于替代 cn。:param cn: 使用 CN。
Information
開發(fā)服務(wù)器不是為了生產(chǎn)環(huán)境,它的出現(xiàn)是為了開發(fā)方便,在高負(fù)載情況下效率是很低的。生產(chǎn)環(huán)境部署一個(gè)應(yīng)用請看 Application Deployment 頁面。
一些應(yīng)用有多個(gè)子域名,你需要模擬本地。幸運(yùn)的是 hosts file 文件可以給本機(jī)分配多個(gè)名字。
這允許你使用 yourapplication.local 和 api.yourapplication.local (或者其他)代替 localhost 訪問本機(jī)。
你可以從下面的地方找到 hosts 文件:
Windows %SystemRoot%\system32\drivers\etc\hosts Linux / OS X /etc/hosts
你可以用你喜歡的文本編輯器打開 hosts 文件,在 localhost 后面加上:
127.0.0.1 localhost yourapplication.local api.yourapplication.local
保存之后你應(yīng)該就可以通過你添加的主機(jī)名字訪問開發(fā)服務(wù)器了。你可以使用URL Routing 系統(tǒng)調(diào)度”兩個(gè)”主機(jī)或自己解析 request.host 。
0.7 新版功能.
從 Werkzeug 0.7 版本開始,開發(fā)服務(wù)器允許在一個(gè)請求后關(guān)閉服務(wù)。目前要求你的Python版本在 2.6 以上,同時(shí)也只能在開發(fā)服務(wù)器啟用。通過在 WSGI 環(huán)境調(diào)用'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 的操作系統(tǒng),比如 Linux, OS X 10.4 或更高 和 Windows Vista一些瀏覽器有時(shí)候訪問本地服務(wù)器很慢,原因有可能是本機(jī)被設(shè)置為同時(shí)支持 ipv4 和ipv6 套接字,一些瀏覽器會(huì)首先嘗試 ipv6 協(xié)議。
而目前集成的服務(wù)器不能同時(shí)支持兩種協(xié)議。為了更好的可移植性,將會(huì)默認(rèn)支持 ipv4協(xié)議。
注意到解決這個(gè)問題有兩種方法。如果你不需要ipv6 支持,你可以移除 hosts file 文件中的下面一行:
::1 localhost
另外你也可以關(guān)閉瀏覽器的 ipv6 支持。比如,在火狐瀏覽器中你可以進(jìn)入about:config 關(guān)閉 network.dns.disableIPv6 。然后,在 werkzeug 0.6.1中不推薦這種做法。
從 Werkzeug 0.6.1 開始服務(wù)器將不再根據(jù)操作系統(tǒng)的配置來轉(zhuǎn)換協(xié)議。這意味著如果你的瀏覽器關(guān)閉 ipv6 支持,而你的操作系統(tǒng)更傾向于 ipv6,你將連接不上服務(wù)器。這種情況下,你可以移除本機(jī) hosts 文件的 ::1 或者明確的用一個(gè) ipv4 協(xié)議地址(127.0.0.1)綁定主機(jī)名。
0.6 新版功能.
內(nèi)置服務(wù)器支持測試目的的 SSL,如果提供一個(gè) SSL上下文,他將會(huì)被使用,這意味著服務(wù)器可以在 HTTP 或 HTTPS 模式下運(yùn)行,但不可同時(shí)在兩種模式下運(yùn)行。這個(gè)功能需要Python OpenSSL 庫。
在werkzeug開發(fā)過程中使用 SSL 最簡單的方法就是通過 werkzeug 生成一個(gè) SSL 證書和私鑰存起來。對于證書你需要提供生成證書的服務(wù)器名或一個(gè) CN.
生成一個(gè) SSL 密鑰并存放在某個(gè)地方:
>>> 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')
現(xiàn)在這個(gè)元組會(huì)當(dāng)作 ssl_context 傳入 run_simple() 方法:
run_simple(‘localhost', 4000, application,ssl_context=(‘/path/to/the/key.crt',
‘/path/to/the/key.key'))
現(xiàn)在當(dāng)你通過瀏覽器訪問 web 應(yīng)用的時(shí)候?qū)⑿枰?yàn)證證書。
你也可以通過代碼創(chuàng)建一個(gè)上下文代替使用 ssl_context 元組。這個(gè)方法是更好控制的:
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() 預(yù)先創(chuàng)建一個(gè)證書。這要求你的系統(tǒng)安裝 openssl 命令行工具:
$ openssl genrsa 1024 > ssl.key
$ openssl req -new -x509 -nodes -sha1 -days 365 -key ssl.key > ssl.cert
開啟 SSL 最簡單的方法就是用 adhoc 模式運(yùn)行服務(wù)。在這個(gè)例子中 Werkzeug 將會(huì)為你創(chuàng)建一個(gè)證書:
run_simple('localhost', 4000, application,
ssl_context='adhoc')
當(dāng)然這種方法也有缺點(diǎn),那就是每次重載服務(wù)你都需要驗(yàn)證證書。不推薦 Adhoc 證書因?yàn)楝F(xiàn)在的瀏覽器因?yàn)榘踩驅(qū)λ麄冎С植⒉缓谩?/p>
更多建議: