CherryPy:创建运行在apache2(mod_wsgi)后面的Web服务

时间:2016-12-13 07:06:59

标签: python apache rest cherrypy

我不熟悉并选择它来创建用于其他Web应用程序的Web服务。我想用apache2和mod_wsgi来运行它。我跟着相当old documentation,你好世界的例子工作得很好。

我现在正在看turotials,当然还有REST tutorial。但是我无法让它运行。我得到状态500并在apache日志中出错:

TypeError: expose_() missing 1 required positional argument: 'func'

为了达到这个目的,我调整了教程中类似于hello world示例的脚本以使用apache:

import sys
sys.stdout = sys.stderr

import random
import string

import cherrypy

cherrypy.config.update({'environment': 'embedded'})

@cherrypy.expose
class StringGeneratorWebService(object):

    @cherrypy.tools.accept(media='text/plain')
    def GET(self):
        return cherrypy.session['mystring']

    def POST(self, length=8):
        some_string = ''.join(random.sample(string.hexdigits, int(length)))
        cherrypy.session['mystring'] = some_string
        return some_string

    def PUT(self, another_string):
        cherrypy.session['mystring'] = another_string

    def DELETE(self):
        cherrypy.session.pop('mystring', None)


conf = {
    '/': {
        'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
        'tools.sessions.on': True,
        'tools.response_headers.on': True,
        'tools.response_headers.headers': [('Content-Type', 'text/plain')],
    }
}
cherrypy.quickstart(StringGeneratorWebService(), '/', conf)

我做错了什么?

1 个答案:

答案 0 :(得分:2)

问题1:

TypeError: expose_() missing 1 required positional argument: 'func'

是因为我使用anaconda python而且使用conda install cherrypy安装的cherrypy版本已经过时(3.8.0)。删除该版本并使用pip安装最新版本解决了这个问题。

问题2:

错误的路由。

cherrypy.quickstart(StringGeneratorWebService(), '/', conf)

应该是

cherrypy.Application(StringGeneratorWebService(), script_name=None, config=conf)

然后只需输入脚本文件的路径即可。

问题3:

cherrypy会话在内存中默认为默认值,并且与mod_wsgi不兼容。您需要使用文件存储进行会话,例如。调整配置:

conf = {
'/': {
    'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
    'tools.sessions.on': True,
    'tools.sessions.storage_type': 'file',
    'tools.sessions.storage_path': '/path/to/sessions', # in case of 500 error check privileges of session folder!!!
    'tools.response_headers.on': True,
    'tools.response_headers.headers': [('Content-Type', 'text/plain')]
}

}