简约的cherrypy网站支持PUT方法
我正在尝试制作一个极简的网站,这个网站只接受两种请求。第一种是在'/'这个地址发起的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)
我该怎么让这个东西正常工作呢?我怎么也搞不明白。谢谢。
2 个回答
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_url
方法上执行PUT
操作,只需使用URL /api/put_url
。用于cherrypy.tree.mount
的配置部分是相对于挂载点的,在这个例子中就是/api
。
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