到目前為止,本教程中開(kāi)發(fā)的Pyramid應(yīng)用程序的例子都是在本地機(jī)器上執(zhí)行的。為了使其能夠公開(kāi)訪問(wèn),必須將其部署在一個(gè)能夠滿足WSGI標(biāo)準(zhǔn)的生產(chǎn)服務(wù)器上。
許多WSGI兼容的http服務(wù)器可用于此目的。例如 –
我們已經(jīng)討論了如何使用Waitress服務(wù)器來(lái)托管一個(gè)Pyramid應(yīng)用程序。它可以在擁有公共IP地址的機(jī)器的80(HTTP)和443(HTTPS)端口上提供服務(wù)。
Apache服務(wù)器是一個(gè)流行的開(kāi)源HTTP服務(wù)器軟件,由Apache軟件基金會(huì)發(fā)布。它為互聯(lián)網(wǎng)上的大多數(shù)網(wǎng)絡(luò)服務(wù)器提供動(dòng)力。 mod_wsgi (由 Graham Dumpleton 開(kāi)發(fā))是一個(gè)Apache模塊,為在Apache上部署基于Python的web應(yīng)用程序提供了一個(gè)WSGI接口。
在本節(jié)中,我們將逐步解釋在Apache服務(wù)器上部署Pyramid應(yīng)用程序的過(guò)程。在這里,我們將使用XAMPP,一個(gè)流行的開(kāi)源Apache發(fā)行版。它可以從https://www.apachefriends.org/download.html 下載。
mod_wsgi模塊是通過(guò)PIP安裝程序安裝的。在安裝之前,將MOD_WSGI_APACHE_ROOTDIR環(huán)境變量設(shè)置為Apache可執(zhí)行文件所在的目錄。
C:\Python310\Scripts>set MOD_WSGI_APACHE_ROOTDIR=C:/xampp/apache
C:\Python310\Scripts>pip install mod_wsgi
接下來(lái),在命令終端運(yùn)行以下命令。
C:\Python310\Scripts>mod_wsgi-express module-config
LoadFile "C:/Python310/python310.dll"
LoadModule wsgi_module "C:/Python310/lib/site-packages/mod_wsgi/server/mod_wsgi.cp310-win_amd64.pyd"
WSGIPythonHome "C:/Python310"
這些是mod_wsgi模塊的設(shè)置,要納入Apache的配置文件。打開(kāi)你的XAMPP安裝的 httpd.conf 文件,將上述命令行的輸出復(fù)制到其中。
接下來(lái),為我們的應(yīng)用程序創(chuàng)建一個(gè)虛擬主機(jī)配置。Apache在 httpd-vhosts.conf 文件中存儲(chǔ)虛擬主機(jī)信息,該文件在C:\XAMPP\Apache\conf\extra\文件夾中找到。打開(kāi)該文件并在其中添加以下幾行
<VirtualHost *>
ServerName localhost:6543
WSGIScriptAlias / e:/pyramid-env/hello/production.ini
<Directory e:/pyramid-env/hello>
Order deny,allow
Allow from all
Require all granted
</Directory>
</VirtualHost>
這里假設(shè)使用Cookiecutter工具構(gòu)建了一個(gè)Hello Pyramid項(xiàng)目。這里使用的是生產(chǎn)環(huán)境中使用的PasteDeploy配置文件。
這個(gè)虛擬主機(jī)配置需要被納入Apache的httpd.conf文件中。這可以通過(guò)在文件中添加以下幾行來(lái)完成
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
我們現(xiàn)在必須將以下代碼保存為 pyramid.wsgi 文件,該文件返回Pyramid WSGI應(yīng)用程序?qū)ο蟆?/p>
from pyramid.paster import get_app, setup_logging
ini_path = 'e:/pyramid-env/hello/production.ini'
setup_logging(ini_path)
application = get_app(ini_path, 'main')
執(zhí)行上述程序后,重新啟動(dòng)XAMPP服務(wù)器,我們應(yīng)該能夠在Apache服務(wù)器上運(yùn)行Pyramid應(yīng)用程序。
Uvicorn是一個(gè)兼容ASGI的服務(wù)器(ASGI是指異步網(wǎng)關(guān)接口)。由于Pyramid是一個(gè)基于WSGI的Web框架,我們需要將WSGI應(yīng)用對(duì)象轉(zhuǎn)換為ASGI對(duì)象,借助于 asgiref.wsgi 模塊中定義的 WsgiToAsgi() 函數(shù)。
from asgiref.wsgi import WsgiToAsgi
from pyramid.config import Configurator
from pyramid.response import Response
def hello_world(request):
return Response("Hello")
with Configurator() as config:
config.add_route("hello", "/")
config.add_view(hello_world, route_name="hello")
wsgi_app = config.make_wsgi_app()
app = WsgiToAsgi(wsgi_app)
將上述代碼保存為app.py。用pip工具安裝Uvicorn。
pip3 install uvicorn
在ASGI模式下運(yùn)行Pyramid應(yīng)用程序。
uvicorn app:app
同樣,它也可以使用 daphne 服務(wù)器來(lái)提供服務(wù)。
daphne app:app
更多建議: