【问题标题】:CherryPy3 and IIS 6.0CherryPy3 和 IIS 6.0
【发布时间】:2010-12-13 06:22:11
【问题描述】:

我有一个使用 Cherrypy 框架的小型 Python Web 应用程序。我绝不是网络服务器方面的专家。

我在我们的 Ubuntu 服务器上使用 mod_python 让 Cherrypy 与 Apache 一起工作。然而,这一次,我必须使用 Windows 2003 和 IIS 6.0 来托管我的网站。

该站点作为一个独立的服务器运行得非常好——当谈到让 IIS 运行时,我简直迷失了方向。在过去的一天里,我一直在谷歌上搜索并盲目地尝试一切以使其运行。

我已经安装了网站告诉我的所有各种工具(Python 2.6、CherrpyPy 3、ISAPI-WSGI、PyWin32),并且我已经阅读了所有文档。这个博客是最有帮助的:

http://whatschrisdoing.com/blog/2008/07/10/turbogears-isapi-wsgi-iis/

但我仍然不知道我需要什么来运行我的网站。我什至找不到任何详尽的示例或入门指南。我希望这里有人可以提供帮助!

干杯。

【问题讨论】:

  • 当你让cherrypy apache 一起工作时,你是否必须将它绑定到不同的端口(例如,8080)以避免与apache 冲突,或者它是否更微妙?我问是因为cherrypy可以做独立的网站并且不需要需要 apache。
  • 我将它绑定到 Apache 的 80 端口。如果您愿意,也可以让独立的 Cherrypy 主机在端口 80(或任何其他)上监听。
  • 端口号无关紧要。当您使用 ISAPI-wsgi 时,WSGI 应用程序是从 Web 服务器进程本地调用的(由 DLL 加载),因此唯一相关的端口号是在 IIS 中配置的端口号。

标签: python iis-6 cherrypy isapi-wsgi


【解决方案1】:

我在我的 IIS 站点后面运行 CherryPy。有几个技巧可以让它发挥作用。

  1. 以 IIS 工作进程身份运行时,您不会拥有与从用户进程运行站点时相同的权限。事情会破裂。特别是,如果不进行一些调整,任何想要写入文件系统的东西都可能无法正常工作。
  2. 如果您使用的是 setuptools,您可能希望使用 -Z 选项安装组件(解压缩所有鸡蛋)。
  3. 使用 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 网站的根目录中。

也欢迎您查看我的production web site code,它已将所有这些重构为不同的模块。

【讨论】:

  • 您好杰森,感谢您的回复。我不得不让网站在星期五运行,所以很遗憾它只是作为一个使用 CherryPy 的进程运行。今天晚些时候我会试试你的建议。通过大量的反复试验,我得到了一个 Hello World (在某种程度上)工作 - 会让你知道我的进展情况。
  • 好的,所以我在这里尝试使用您的示例,但遇到了与我自己的 HelloWorld 相同的问题。我相信我的 IIS 配置是问题所在,而不是我的 Python。当我尝试运行您的 HelloWorld 时,我收到一个错误,并以以下结尾:。但是,我可以将其安装为虚拟目录(更改 Name 参数)。除非我有一个与 VD 同名的公开方法,否则我会得到一个 CherryPy 服务器 404。我讨厌成为这样的新手,但你能说明如何从一开始就设置 IIS 站点吗?
  • 仔细检查您使用的是 isapi-wsgi 0.4.1。 0.4 存在一个问题,无法正确检测到某些网站(与 IIS 站点对象中 /ROOT 的情况有关)。
  • 就创建IIS站点而言,我通常只是进入IIS管理器并创建一个名为“CherryPy Web Server”的新网站,没有特殊处理。具体来说,我创建了目录\inetpub\cherrypy,将上述代码保存为该目录中的hook.py,运行'hook.py install',然后浏览到新创建的站点,它就可以工作了。
  • 获得 404 的原因是 CherryPy 不会隐式删除 IIS 交给它的路径名的任何部分。如果要将 CherryPy 应用程序安装到根以外的任何位置,则需要更改 CherryPy 的安装位置。我将更新脚本以考虑非 root 安装。
【解决方案2】:

好的,我搞定了。感谢杰森和他的所有帮助。我需要打电话

cherrypy.config.update({
  'tools.sessions.on': True
})
return cherrypy.tree.mount(Root(), '/', config=path_to_config)

我在 [/] 下的配置文件中有这个,但由于某种原因它不喜欢这样。现在我可以让我的网络应用程序启动并运行——然后我想我会尝试找出为什么它需要更新配置并且不喜欢我拥有的配置文件......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2011-09-15
    • 2010-10-23
    相关资源
    最近更新 更多