极简主义的樱桃网站与PUT方法

时间:2014-10-18 10:33:05

标签: python rest 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 个答案:

答案 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