标题是相当不言自明的,所以我只展示一些我到目前为止尝试过的代码:
来自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"
修复此问题。
答案 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无关。它们是复制粘贴而不了解主题。让我们理清一点。
/API/Test
到root.API.Test
。它的常见用途是定期GET / POST网络流程。MethodDispatcher
。python-jsonrpc
包。以下是#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)