在CherryPy中创建一个基本的JSONRPC API - 获取404s

时间:2013-09-22 22:14:49

标签: python api python-2.7 cherrypy json-rpc

标题是相当不言自明的,所以我只展示一些我到目前为止尝试过的代码:

来自https://stackoverflow.com/a/713950

import cherrypy
from cherrypy import expose

cherrypy.config.update({'server.socket_port': 80})

class Test:
    @expose
    def test_call(self):
        return "Testing"

cherrypy.quickstart(Test())

另外,从另一篇SO帖子中,有以下两种变体:

cherrypy.config.update({
    'server.socket_port': 80,
    '/': {
        'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
        'tools.trailing_slash.on': False
    }
})

class Test:
    def test_call(self, *args):
        return json.dumps(args)
    test_call.exposed = True

class API:
    def __init__(self):
        self.Test = Test()

class Root:
    def __init__(self):
        self.API = API()


cherrypy.tree.mount(Root())
cherrypy.quickstart(Root())

此处建议的变体:Path Not Found in CherryPy

cherrypy.quickstart(cherrypy.Application(Root(), '/', {}))

我运行这些并访问http://mysite.com/test_call或者在另一种情况下访问mysite.com/api/test/test_call,除了返回404之外,这些似乎都没有做任何事情。想法?

完全打开尝试不同的框架,如果它只是让我公开一些函数调用来转储JSON。我不需要任何花哨或酷,只需运作。

编辑:显然我的问题是服务器默认是期望是localhost,这基本上让我变成了白痴。添加cherrypy.server.socket_host = "mydomain.com"修复此问题。

2 个答案:

答案 0 :(得分:0)

我尝试了下面的第一个脚本(有2个注释,使用root用户,如果使用端口80)。通过“http:// 127.0.0.1 / test_call”访问它。它有效。

您应该更具体地提出您的问题(提供您的代码),以便听众知道如何帮助解决问题。

#! /usr/bin/python3

import cherrypy
from cherrypy import expose

## NOTE 1 - using 0.0.0.0
cherrypy.config.update({'server.socket_host' : '0.0.0.0', 'server.socket_port': 80})

class Test:
    @expose
    def test_call(self):
        return "Testing"

## NOTE 2 - a work around for python3 and cherrypy v3.x
## work around OSERR issue - OSError: Port 7766 not bound on '10.220.203.233'
## refer to http://stackoverflow.com/questions/767575/crp-hello-world-error
def fake_wait_for_occupied_port(host, port): return
cherrypy.process.servers.wait_for_occupied_port = fake_wait_for_occupied_port

cherrypy.quickstart(Test())

答案 1 :(得分:0)

标题与示例不符,并且告诉您可能被REST专家误导,在您链接的答案评论中,他们倾向于将所有内容称为“RPC”,这与其CRUD限制的资源视角不同。 JSON RPC是the certain specification,它定义了请求和响应的JSON结构。它看起来像这样。

--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}
<-- {"jsonrpc": "2.0", "result": 19, "id": 1}

您的示例与REST以及REST无关。它们是复制粘贴而不了解主题。让我们理清一点。

  1. CherryPy有多个dispatching选项。 Default dispatcher将请求网址片段映射到Python对象树,例如第二个示例中的/API/Testroot.API.Test。它的常见用途是定期GET / POST网络流程。
  2. 如果您想实现RESTful API,请参阅以下专用手册页:Creating RESTful applications in CherryPy。它简要介绍了MethodDispatcher
  3. 的样式和用法
  4. 如果您想要实际的JSON RPC,那么您可以查看具有CherryPy适配器的python-jsonrpc包。
  5. 但是,如果你想要实现的只是返回一个带有适当内容类型标题的JSON字符串,那么CherryPy有一个特定的工具,所以没有必要手动执行它。
  6. 以下是#4的示例。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    
    import cherrypy
    
    
    config = {
      'global' : {
        'server.socket_host' : '127.0.0.1',
        'server.socket_port' : 8080,
        'server.thread_pool' : 8
      }
    }
    
    class Api:
    
      @cherrypy.expose
      @cherrypy.tools.json_out()
      def oneway(self):
        '''Just open http://127.0.0.1:8080/api/oneway'''
        return {
          'foo' : 'bar',
          'baz' : 'another one'
        }
    
      @cherrypy.expose
      @cherrypy.tools.json_in()
      @cherrypy.tools.json_out()
      def twoway(self):
        '''You can call it like:
        curl -X POST -H "Content-Type: application/json" \
          -d '{"foo":123,"bar":"baz"}' http://127.0.0.1:8080/api/twoway
        '''
    
        data = cherrypy.request.json
        return data.items()
    
    
    if __name__ == '__main__':
      cherrypy.quickstart(Api(), '/api', config)