【问题标题】:Minimalist cherrypy website with PUT method使用 PUT 方法的极简樱桃网站
【发布时间】:2014-12-13 20:24:07
【问题描述】:

我正在尝试制作一个只接受两个请求的极简主义网站。首先是 '/' 上的 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)

如何让这个东西工作?出于某种原因,我无法弄清楚这一点。谢谢。

【问题讨论】:

标签: python rest cherrypy put


【解决方案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

【讨论】:

    【解决方案2】:

    问题是您在同一个应用程序上混合了调度程序。

    例如,将调度程序移动到应用程序的根目录,并将 Main 对象更改为将方法作为 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

    【讨论】:

      猜你喜欢
      • 2016-05-04
      • 2016-03-11
      • 2012-03-14
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2012-07-06
      相关资源
      最近更新 更多