我在我的 IIS 站点后面运行 CherryPy。有几个技巧可以让它工作。
- 作为 IIS 工作进程标识运行时,您将不会拥有与从用户进程运行站点时相同的权限。事情会破裂。特别是,如果不进行一些调整,任何想要写入文件系统的东西都可能无法工作。
- 如果您使用的是 setuptools,您可能希望使用 -Z 选项安装组件(解压缩所有鸡蛋)。
- 使用 win32traceutil 跟踪问题。确保在你的钩子脚本中你正在导入 win32traceutil。然后,当您尝试访问该网站时,如果出现任何问题,请确保将其打印到标准输出,它将被记录到跟踪实用程序中。使用“python -m win32traceutil”查看跟踪的输出。
了解使 ISAPI 应用程序运行的基本过程非常重要。我建议首先在 ISAPI_WSGI 下运行一个 hello-world WSGI 应用程序。这是我用来验证我让 CherryPy 与我的 Web 服务器一起工作的钩子脚本的早期版本。
#!python
"""
Things to remember:
easy_install munges permissions on zip eggs.
anything that's installed in a user folder (i.e. setup develop) will probably not work.
There may still exist an issue with static files.
"""
import sys
import os
import isapi_wsgi
# change this to '/myapp' to have the site installed to only a virtual
# directory of the site.
site_root = '/'
if hasattr(sys, "isapidllhandle"):
import win32traceutil
appdir = os.path.dirname(__file__)
egg_cache = os.path.join(appdir, 'egg-tmp')
if not os.path.exists(egg_cache):
os.makedirs(egg_cache)
os.environ['PYTHON_EGG_CACHE'] = egg_cache
os.chdir(appdir)
import cherrypy
import traceback
class Root(object):
@cherrypy.expose
def index(self):
return 'Hai Werld'
def setup_application():
print "starting cherrypy application server"
#app_root = os.path.dirname(__file__)
#sys.path.append(app_root)
app = cherrypy.tree.mount(Root(), site_root)
print "successfully set up the application"
return app
def __ExtensionFactory__():
"The entry point for when the ISAPIDLL is triggered"
try:
# import the wsgi app creator
app = setup_application()
return isapi_wsgi.ISAPISimpleHandler(app)
except:
import traceback
traceback.print_exc()
f = open(os.path.join(appdir, 'critical error.txt'), 'w')
traceback.print_exc(file=f)
f.close()
def install_virtual_dir():
import isapi.install
params = isapi.install.ISAPIParameters()
# Setup the virtual directories - this is a list of directories our
# extension uses - in this case only 1.
# Each extension has a "script map" - this is the mapping of ISAPI
# extensions.
sm = [
isapi.install.ScriptMapParams(Extension="*", Flags=0)
]
vd = isapi.install.VirtualDirParameters(
Server="CherryPy Web Server",
Name=site_root,
Description = "CherryPy Application",
ScriptMaps = sm,
ScriptMapUpdate = "end",
)
params.VirtualDirs = [vd]
isapi.install.HandleCommandLine(params)
if __name__=='__main__':
# If run from the command-line, install ourselves.
install_virtual_dir()
这个脚本做了几件事。它 (a) 充当安装程序,将自身安装到 IIS [install_virtual_dir],(b) 包含 IIS 加载 DLL [__ExtensionFactory__] 时的入口点,以及 (c) 它创建 ISAPI 处理程序 [setup_application] 使用的 CherryPy WSGI 实例]。
如果你把它放在你的 \inetpub\cherrypy 目录中并运行它,它会尝试将自己安装到名为“CherryPy Web Server”的 IIS 网站的根目录中。
也欢迎您查看我的生产网站代码,它已将所有这些重构为不同的模块。