无法在 cherryPy 中同时添加多个应用程序
Unable to add more than one applications together in cherryPy
当我这样做并尝试访问“/api”时,cherryPy 抛出 "TypeError: 'ApiStringGenerator' object is not callable" 错误
'''
Created on Jan 11, 2016
@author: ankurjat
'''
import cherrypy
import random
import string
import os
conf = {'/': {'tools.sessions.on': True,
'tools.staticdir.root': os.path.abspath(os.getcwd())},
'/static': {'tools.staticdir.on': True,
'tools.staticdir.dir': './resources'},
'/api': {'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
'tools.sessions.on': True,
'tools.response_headers.on': True,
'tools.response_headers.headers': [('Content-Type', 'text/plain')]}
}
class ApiStringGenerator(object):
exposed = True
@cherrypy.tools.accept(media='text/plain')
def GET(self, length=8):
value = cherrypy.session['mystring']
return value
def POST(self, length=8):
value = ''.join(random.sample(string.hexdigits, int(length)))
cherrypy.session['mystring'] = value
return value
def PUT(self, value):
cherrypy.session['mystring'] = value
def DELETE(self):
cherrypy.session.pop('mystring', None)
class StringGenerator(object):
@cherrypy.expose
def index(self):
return file('templates/index.html')
if __name__ == '__main__':
cherrypy.tree.mount(ApiStringGenerator(), '/api', conf)
cherrypy.tree.mount(StringGenerator(), '/', conf)
cherrypy.engine.start()
cherrypy.engine.block()
但是当我更改以下行时
cherrypy.tree.mount(ApiStringGenerator(), '/api', conf)
cherrypy.tree.mount(StringGenerator(), '/', conf)
cherrypy.engine.start()
cherrypy.engine.block()
通过代码
webapp = StringGenerator()
webapp.api = ApiStringGenerator()
cherrypy.quickstart(webapp, '/', conf)
然后没有错误,一切正常。
请帮忙。
问题是cherrypy里面的配置是相对于挂载点的
因此,当您在 /api
中配置 MethodDispatcher
时,挂载点 /api
内。您正在 /api/api
中激活 MethodDispatcher
并且在 /api
中使用的调度程序是默认调度程序,因此尝试调用该对象,因为该对象具有 exposed
属性但是它是不可调用的。这是默认调度程序的行为。
如果你想做:
cherrypy.tree.mount(ApiStringGenerator(), '/api', conf)
配置需要相对于/api
:
{'/': {'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
'tools.sessions.on': True,
'tools.response_headers.on': True,
'tools.response_headers.headers': [('Content-Type', 'text/plain')]}}
当我这样做并尝试访问“/api”时,cherryPy 抛出 "TypeError: 'ApiStringGenerator' object is not callable" 错误
'''
Created on Jan 11, 2016
@author: ankurjat
'''
import cherrypy
import random
import string
import os
conf = {'/': {'tools.sessions.on': True,
'tools.staticdir.root': os.path.abspath(os.getcwd())},
'/static': {'tools.staticdir.on': True,
'tools.staticdir.dir': './resources'},
'/api': {'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
'tools.sessions.on': True,
'tools.response_headers.on': True,
'tools.response_headers.headers': [('Content-Type', 'text/plain')]}
}
class ApiStringGenerator(object):
exposed = True
@cherrypy.tools.accept(media='text/plain')
def GET(self, length=8):
value = cherrypy.session['mystring']
return value
def POST(self, length=8):
value = ''.join(random.sample(string.hexdigits, int(length)))
cherrypy.session['mystring'] = value
return value
def PUT(self, value):
cherrypy.session['mystring'] = value
def DELETE(self):
cherrypy.session.pop('mystring', None)
class StringGenerator(object):
@cherrypy.expose
def index(self):
return file('templates/index.html')
if __name__ == '__main__':
cherrypy.tree.mount(ApiStringGenerator(), '/api', conf)
cherrypy.tree.mount(StringGenerator(), '/', conf)
cherrypy.engine.start()
cherrypy.engine.block()
但是当我更改以下行时
cherrypy.tree.mount(ApiStringGenerator(), '/api', conf)
cherrypy.tree.mount(StringGenerator(), '/', conf)
cherrypy.engine.start()
cherrypy.engine.block()
通过代码
webapp = StringGenerator()
webapp.api = ApiStringGenerator()
cherrypy.quickstart(webapp, '/', conf)
然后没有错误,一切正常。 请帮忙。
问题是cherrypy里面的配置是相对于挂载点的
因此,当您在 /api
中配置 MethodDispatcher
时,挂载点 /api
内。您正在 /api/api
中激活 MethodDispatcher
并且在 /api
中使用的调度程序是默认调度程序,因此尝试调用该对象,因为该对象具有 exposed
属性但是它是不可调用的。这是默认调度程序的行为。
如果你想做:
cherrypy.tree.mount(ApiStringGenerator(), '/api', conf)
配置需要相对于/api
:
{'/': {'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
'tools.sessions.on': True,
'tools.response_headers.on': True,
'tools.response_headers.headers': [('Content-Type', 'text/plain')]}}