我正在努力建立一个简约的网站,接受两个请求。首先是'/'上的GET请求,它应该回复一些简单的字符串。第二个是关于'/ put_url'的PUT请求,它接受一个数据块。以下是我到目前为止的情况:
import cherrypy
class Main(object):
@cherrypy.expose
def index(self):
return "Hy?"
class Uploader(object):
exposed = True
def PUT(self, data):
print "hello"
print data
if __name__ == '__main__':
conf = {
'/put_url': {
'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
'tools.response_headers.on': True,
'tools.response_headers.headers': [('Content-Type', 'text/plain')]
}
}
webapp = Main()
webapp.put_url = Uploader()
cherrypy.quickstart(webapp, '/', conf)
我如何让这件事起作用?出于某种原因,我无法弄清楚这一点。感谢。
答案 0 :(得分:1)
添加接受标头。为此,请在PUT方法中添加一个装饰器。
class Uploader(object):
exposed = True
@cherrypy.tools.accept(media='text/plain')
def PUT(self, data):
print "hello"
print data
您可能并不总是希望将text / plain用作接受标头。这取决于你的申请。
测试你可以使用
curl -X PUT -d data=xyz localhost:8080/put_url
答案 1 :(得分:1)
问题是你在同一个应用程序上混合调度员。
例如,将调度程序移动到应用程序的根目录,将主要对象更改为具有HTTP方法的方法,您将具有以下内容:
import cherrypy as cp
class Main(object):
exposed = True
def GET(self):
return "Hy?"
class Uploader(object):
exposed = True
def PUT(self, data):
cp.log.error("hello")
cp.log.error(data)
return "The data {} has been puted".format(data)
if __name__ == '__main__':
conf = {
'/': {
'request.dispatch': cp.dispatch.MethodDispatcher()
},
'/put_url': {
'tools.response_headers.on': True,
'tools.response_headers.headers': [('Content-Type', 'text/plain')]
}
}
webapp = Main()
webapp.put_url = Uploader()
cp.quickstart(webapp, '/', conf)
也可以将默认调度程序与方法调度程序混合,例如:
import cherrypy as cp
class Main(object):
@cp.expose
def index(self):
return "Hy?"
class Uploader(object):
exposed = True
def PUT(self, data):
cp.log.error("hello")
cp.log.error(data)
return "The data {} has been puted".format(data)
class API(object):
exposed = True
def __init__(self):
self.put_url = Uploader()
def GET(self):
return "Welcome to the API!"
if __name__ == '__main__':
cp.tree.mount(Main())
cp.tree.mount(API(), '/api', config={
'/': {
'request.dispatch': cp.dispatch.MethodDispatcher()
},
'/put_url': {
'tools.response_headers.on': True,
'tools.response_headers.headers': [('Content-Type', 'text/plain')]
}
})
cp.engine.start()
cp.engine.block()
注意API
对象是如何在/api
上挂载的。要PUT
方法上的put_url
,请使用网址/api/put_url
。用于cherrypy.tree.mount
的配置节相对于挂载点,在本例中为/api
。