gpt4 book ai didi

Python CherryPy 服务器,cherrypy.Application 是做什么的?

转载 作者:行者123 更新时间:2023-12-01 04:20:40 26 4
gpt4 key购买 nike

我这里有一个Python程序。它使用 CherryPy 创建服务器。

# coding:utf-8

import os.path
import cherrypy

from app import application

def main():

try:
currentDir_s = os.path.dirname(os.path.abspath(__file__))
except:
currentDir_s = os.path.dirname(os.path.abspath(sys.executable))
cherrypy.Application.currentDir_s = currentDir_s

configFileName_s = 'server.conf'
if os.path.exists(configFileName_s) == False:
configFileName_s = None

cherrypy.engine.autoreload.unsubscribe()
cherrypy.engine.timeout_monitor.unsubscribe()

cherrypy.quickstart(application.Application_cl(), config=configFileName_s)

if __name__ == '__main__':
main()

并在“server.conf”中配置服务器:

[global]
tools.log_headers.on: True
tools.sessions.on: False
tools.encode.on: True
tools.encode.encoding:"utf-8"

server.socket_port: 8080
server.socket_timeout:60

server.thread_pool: 10
server.environment: "production"
log.screen: True

[/]
tools.staticdir.root: cherrypy.Application.currentDir_s
tools.staticdir.on = True
tools.staticdir.dir = '.'

有一件事我不明白,这一行(python 代码中的第 13 行):

cherrypy.Application.currentDir_s = currentDir_s

我在网上搜索过这个问题,但没有找到任何信息。 “cherrypy.Application”有什么作用?为什么我必须执行此作业(cherrypy.Application.currentDir_s = currentDir_s)?

最佳答案

我搜索了cherrypy源代码,这是我发现的。在_cptree.py模块中,您将找到Application类。在其下面,有一个 Tree 类,它具有 mount 方法,我们用来绑定(bind)应用程序(例如 cherrypy.tree.mount(Root(), "/", config=config))

def mount(self, root, script_name="", config=None):
...

当您查看此方法时,您将看到下面的代码;

def mount(self, root, script_name="", config=None):
...
if isinstance(root, Application):
app = root
if script_name != "" and script_name != app.script_name:
raise ValueError(
"Cannot specify a different script name and pass an "
"Application instance to cherrypy.mount")
script_name = app.script_name
else:
app = Application(root, script_name)

# If mounted at "", add favicon.ico
if (script_name == "" and root is not None
and not hasattr(root, "favicon_ico")):
favicon = os.path.join(os.getcwd(), os.path.dirname(__file__),
"favicon.ico")
root.favicon_ico = tools.staticfile.handler(favicon)

if config:
app.merge(config)

self.apps[script_name] = app

因此,代码表示您传递给 mount 方法的每个对象(应用程序)要么是 Application 实例,要么包装在 Application 中实例。那么为什么会这样呢?当您检查 Tree 类上方的 Application 类时,您将看到如下所示的 __call__ 方法;

def __call__(self, environ, start_response):
return self.wsgiapp(environ, start_response)

是的,你现在看到了,它是 wsgi界面。因此,Application 是 Cherrypy 应用程序的 wsgi 包装器。当你检查cherrypy的源代码时,你可能会学到很多东西。希望这个回答对您有所帮助。

关于Python CherryPy 服务器,cherrypy.Application 是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33745708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com