您好我正在尝试创建一个可以与Backbone.js一起使用的cherrypy脚本
我希望能够从主应用程序加载索引页面,然后从子应用程序运行restful操作。 当我请求GET从数据库中提取列表时,我可以加载索引页面并获得响应,但是我得到了PUT和DELETE方法的404错误。
请参阅下面的代码:
主要应用:
import cherrypy
import os.path
import json
import mysql.connector
import list
class Root:
@cherrypy.expose
def index(self):
index = open(r"html/test.html","r")
return index
current_dir = os.path.dirname(os.path.abspath(__file__))
cherrypy.config.update({'server.socket_host':'0.0.0.0','server.socket_port':8084,'tools.sessions.on': True,'tools.sessions.storage_type':'ram','tools.sessions.timeout':120,
'log.error_file':'site_error.log','log.access_file':'site.log','log.screen': True,'response.timeout':100
})
d = cherrypy.dispatch.MethodDispatcher()
conf = {'/': {'request.dispatch': d}}
main_confg = {'/css':{'tools.staticdir.on': True,'tools.staticdir.dir': os.path.join(current_dir, 'css')},
'/html':{'tools.staticdir.on': True,'tools.staticdir.dir': os.path.join(current_dir, 'html')},
'/images':{'tools.staticdir.on': True,'tools.staticdir.dir': os.path.join(current_dir, 'image')},
'/script':{'tools.staticdir.on': True,'tools.staticdir.dir': os.path.join(current_dir, 'script')},
}
if __name__ == '__main__':
cherrypy.tree.mount(list.List(),'/list',conf)
cherrypy.tree.mount(Root(),'/',main_confg)
cherrypy.engine.start()
cherrypy.engine.block()
Rest映射到主应用程序的应用程序:
import cherrypy
import os.path
import json
import mysql.connector
class List:
exposed = True
def dispatch(self, vpath):
if vpath:
id = vpath.pop(0)
return MyData(id)
return False
def GET(self, id=None):
list = []
con = mysql.connector.connect(host="localhost",user='',password="",database='test',buffered=True)
cur = con.cursor()
if id == None:
cur.execute('select idtask,create_date,title,completed from task')
else:
cur.execute('select idtask,create_date,title,completed from task where idtask = %s',(id,))
for x in cur:
record = {'idtask':x[0],'create_date':str(x[1]),'title':x[2],'completed':x[3]}
list.append(record)
return json.dumps(list)
def POST(self,**Kwargs):
return str(Kwargs)
def PUT(self,**Kwargs):
return str(Kwargs)
def DELETE(self,**Kwargs):
return Kwargs
答案 0 :(得分:1)
暂且不使用dispatch
方法(可能你的意思是_cp_dispatch)你的代码看起来很好,这是你试图存档的一个例子以及一些curl命令来测试这个应用程序,我认为你有一些东西你的骨干调用错了:
import cherrypy as cp
class ConventionalApp(object):
@cp.expose
def index(self):
return ("Hi I'm completely conventional and I give"
" a **** about REST")
class LeObject(object):
exposed = True
def GET(self, id=None):
if id is not None:
return "Here is your object with id %s" % id
else:
return "Imagine the list with all the objects"
def DELETE(self, id, **kwargs):
return "%s DELETED" % id
def PUT(self, **kwargs):
return "PUTTED"
def main():
cp.tree.mount(ConventionalApp(), '')
config = {'/': {'request.dispatch': cp.dispatch.MethodDispatcher()}}
cp.tree.mount(LeObject(), '/list', config=config)
cp.engine.start()
cp.engine.block()
if __name__ == '__main__':
main()
curl命令:
curl localhost:8080
curl localhost:8080/list
curl localhost:8080/list/1
curl -X DELETE localhost:8080/list/12
curl -X PUT -H "Content-Length: 0" localhost:8080/list/