我正在尝试使用CherryPy的WSGI服务器来提供静态文件,例如在Flask与CherryPy一起使用中以提供静态文件 那里接受的答案的选项2看起来和我想做的完全一样,但是当我尝试使用静态目录处理程序时出现了KeyError

我试过的

>>>> import cherrypy
>>>> from cherrypy import wsgiserver
>>>> import os
>>>> static_handler = cherrypy.tools.staticdir.handler(section='/', dir=os.path.abspath('server_files')
>>>> d = wsgiserver.WSGIPathInfoDispatcher({'/': static_handler})
>>>> server = wsgiserver.CherryPyWSGIServer(('localhost', 12345), d)
>>>> server.start()

然后,当我尝试访问服务器时,控制台中出现500响应和以下错误:

KeyError('tools',)
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/cherrypy/wsgiserver/wsgiserver2.py", line 1353, in communicate
    req.respond()
  File "/Library/Python/2.7/site-packages/cherrypy/wsgiserver/wsgiserver2.py", line 868, in respond
    self.server.gateway(self).respond()
  File "/Library/Python/2.7/site-packages/cherrypy/wsgiserver/wsgiserver2.py", line 2267, in respond
    response = self.req.server.wsgi_app(self.env, self.start_response)
  File "/Library/Python/2.7/site-packages/cherrypy/wsgiserver/wsgiserver2.py", line 2477, in __call__
    return app(environ, start_response)
  File "/Library/Python/2.7/site-packages/cherrypy/_cptools.py", line 175, in handle_func
    handled = self.callable(*args, **self._merged_args(kwargs))
  File "/Library/Python/2.7/site-packages/cherrypy/_cptools.py", line 102, in _merged_args
    tm = cherrypy.serving.request.toolmaps[self.namespace]
KeyError: 'tools'

每次我尝试击中服务器应该能够显示的任何内容时,都会显示两次。 当我将Flask应用程序连接到服务器时,Flask应用程序可以按预期工作,但是静态文件服务仍然出现相同的错误。

我需要怎么做才能使staticdir.handler工作?

#1楼 票数:1

我尝试了各种方法使其工作起来,直到今天还遇到了您所看到的KeyError(以及其他问题)。

最终,通过改编本要点 (包括在下面)中的代码,我设法使CherryPy与Django应用程序一起提供静态服务。

import os
import cherrypy
from cherrypy import wsgiserver

from my_wsgi_app import wsgi

PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), 'public'))


class Root(object):
    pass

def make_static_config(static_dir_name):
    """
    All custom static configurations are set here, since most are common, it
    makes sense to generate them just once.
    """
    static_path = os.path.join('/', static_dir_name)
    path = os.path.join(PATH, static_dir_name)
    configuration = {static_path: {
        'tools.staticdir.on': True,
        'tools.staticdir.dir': path}
    }
    print configuration
    return cherrypy.tree.mount(Root(), '/', config=configuration)

# Assuming your app has media on diferent paths, like 'c', 'i' and 'j'
application = wsgiserver.WSGIPathInfoDispatcher({
    '/': wsgi.application,
    '/c': make_static_config('c'),
    '/j': make_static_config('j'),
    '/i': make_static_config('i')})

server = wsgiserver.CherryPyWSGIServer(('0.0.0.0', 8070), application,
                                       server_name='www.cherrypy.example')
try:
    server.start()
except KeyboardInterrupt:
    print "Terminating server..."
    server.stop()

希望包装Flask应用程序会非常相似。

对我来说,关键是在虚拟类上使用cherrypy.tree.mount ,而不是尝试直接使用staticdir.handler。

出于好奇-我使用要点中的代码自定义了django-cherrypy的runcpserver管理命令的版本,尽管事后看来,从头开始创建新命令可能会更容易。

祝您好运(并感谢Alfredo Deza )!

  ask by Rob Watts translate from so

未解决问题?本站智能推荐:

1回复

在CherryPy中包含静态公共页眉/页脚

我正在使用cherryPy创建一个简单的python网络应用程序。 我计划在几页上使用相同的页眉/页脚。 如何在例如index.html静态页面中包含或合并页眉/页脚? 现在,我可以返回整个静态页面或动态内容: 在PHP中,您只需将其包含在内,但在python / cherrypy中
1回复

CherryPy不会开始

我在启动CherryPy时遇到了一些麻烦,我无法弄清楚为什么我会一直收到这个错误。 这是版本和带日志输出的相关代码。 Python 2.7.6 CherryPy 3.5.0(通过PIP) 这是日志输出:
1回复

如何在cherrypy框架的html文件内使用python代码?

我正在为我的python开发学习Cherrypy框架。我创建了一个数据库,插入了一些数据,现在我想检索它并在浏览器中显示它。数据在sqlite数据库中创建,但是当显示数据时,它只是显示为循环显示在浏览器中打印数据的过程。 我的html文件,
1回复

python-导入错误:无法导入名称wsgiserver

为 web 运行 python 脚本时出现以下错误 在 python 2.7.15 上运行 这在我们不得不禁用ssl 2和ssl 3之后开始失败,因此不得不添加ssl_adapter但 BuiltinSSLAdapter 因导入失败。 如果有任何其他选择,请提出建议。 基本上想禁用ssl 2和ssl
1回复

cherrypy:python如何在日志旋转器的帮助下每天创建单独的请求日志文件

我想创建单独的日志文件,以进行cherrypy中的访问和错误。 我阅读了http://docs.cherrypy.org/dev/refman/_cplogging.html ,但是我没有写代码来实现日志记录。 我阅读了更多链接Python Cherrypy Access Log Rota
1回复

CherryPy无法绑定到端口

谢谢大家的专业知识。 我们正在运行一个使用Cherrypy公开/处理我们的API的python服务器。 在将Ubuntu 10.10升级到11.04(具有固有的python更新)之前,此功能运行良好,但是不幸的是,此后CherryPy并未绑定端口80(使用代理端口9998)。 错误转储如下
1回复

在openshift上导入CherryPy失败

我在openshift齿轮上运行基于Cherrypy的应用程序。 最近,每次尝试转到该站点时,我都会收到“ 503服务暂时不可用”错误。 检查日志,我发现在尝试导入CherryPy时遇到了ImportError。 这很奇怪-CherryPy在我的requirements.txt中被列为依赖
1回复

Cherrypy服务器运行python脚本

我想当我在cherrypy中按下一个按钮时,执行了一个特定的python脚本,我试图像那样添加它,但是当然不起作用,正确的方法是什么 我要执行的是(ser = serial.Serial('/ dev / ttyUSB0')​​ser.write(b'hello'))