简约的cherrypy网站支持PUT方法

0 投票
2 回答
1528 浏览
提问于 2025-04-28 06:19

我正在尝试制作一个极简的网站,这个网站只接受两种请求。第一种是在'/'这个地址发起的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

撰写回答