在CherryPy中創建REST風格的Web API的最佳方法是什麼?我一直在四處尋找,沒有什麼看起來很棒。對於Django來說,似乎有很多工具可以做到這一點,但對於CherryPy來說不是這樣,或者我不知道它們。CherryPy和REST風格的Web API
後來編輯:我應該如何使用CherryPy的像/ getOrders佔= X &類型= Y變換的請求弄成/命令/帳號/類型?
在CherryPy中創建REST風格的Web API的最佳方法是什麼?我一直在四處尋找,沒有什麼看起來很棒。對於Django來說,似乎有很多工具可以做到這一點,但對於CherryPy來說不是這樣,或者我不知道它們。CherryPy和REST風格的Web API
後來編輯:我應該如何使用CherryPy的像/ getOrders佔= X &類型= Y變換的請求弄成/命令/帳號/類型?
我假設你已經嘗試了部分匹配,就像本教程中討論的一樣。我發現雖然不是很好,但它大部分時間完成了工作。
除此之外,雖然我沒有嘗試過,但Cherrypy顯然支持Routes(請參閱http://www.cherrypy.org/wiki/PageHandlers),它爲您提供了各種RESTful選項。
我不知道這是否是「最佳」的方式,但在這裏就是我如何做到這一點:
import cherrypy
class RESTResource(object):
"""
Base class for providing a RESTful interface to a resource.
To use this class, simply derive a class from it and implement the methods
you want to support. The list of possible methods are:
handle_GET
handle_PUT
handle_POST
handle_DELETE
"""
@cherrypy.expose
def default(self, *vpath, **params):
method = getattr(self, "handle_" + cherrypy.request.method, None)
if not method:
methods = [x.replace("handle_", "")
for x in dir(self) if x.startswith("handle_")]
cherrypy.response.headers["Allow"] = ",".join(methods)
raise cherrypy.HTTPError(405, "Method not implemented.")
return method(*vpath, **params);
class FooResource(RESTResource):
def handle_GET(self, *vpath, **params):
retval = "Path Elements:<br/>" + '<br/>'.join(vpath)
query = ['%s=>%s' % (k,v) for k,v in params.items()]
retval += "<br/>Query String Elements:<br/>" + \
'<br/>'.join(query)
return retval
class Root(object):
foo = FooResource()
@cherrypy.expose
def index(self):
return "REST example."
cherrypy.quickstart(Root())
您只需從RESTResource
類派生和處理兩者的RESTful動詞,你的願望(GET,PUT, POST,DELETE),同名方法的前綴爲handle_
。如果您不處理特定動詞(如POST),則基類將爲您提出405 Method Not Implemented
錯誤。
路徑項目在vpaths
中傳遞,並且任何查詢字符串都被傳入params
。使用上面的示例代碼,如果您要請求/foo/bar?woo=hoo
,vpath[0]
將爲bar
,並且params
將爲{'woo': 'hoo'}
。
要回答你的第二個問題,你要定義和暴露默認的方法:使用此方法
class getOrders(Object):
def default(account, type):
...
default.exposed = True
,getOrders/X/Y將映射到default(account='x', type='y')
。就像其他人說的那樣,這不是很好,但它完成了工作。
就REST風格的應用程序而言,我敢肯定,默認頁面處理程序將適用於這樣的應用程序。
因爲HTTP定義了這些調用方法,所以使用CherryPy實現REST最直接的方法是使用MethodDispatcher而不是默認的調度程序。
更可以在CherryPy的文檔中找到: http://cherrypy.readthedocs.io/en/latest/tutorials.html#tutorial-7-give-us-a-rest
這裏也是關於如何發送和使用CherryPy的工具接收JSON詳細說明: http://tools.cherrypy.org/wiki/JSON
最後一個環節現在沒有了。 – 2018-01-23 10:55:03
所以要變換/ getOrders? account = X & type = Y使用Cherrypy將其轉換爲/ orders/account /類型。
我會嘗試在http://cherrypy.readthedocs.org/en/latest/tutorial/REST.html中使用的方法,如@Tomasz Blachowicz所述,並進行一些修改。
請記住,你可以處理類似/順序/帳號/類型與
@cherrypy.expose
def order(account=None, type=None):
print account, type
class Root(object):
pass
root = Root()
root.orders = orders
cherrypy.quickstart(root, '/')
所以,如果你把在http://cherrypy.readthedocs.org/en/latest/tutorial/REST.html給出的例子,你可以修改它來處理這類網址。
class Orders(object):
exposed = True
def __init__(self):
pass
def GET(self, account=None, type=None):
#return the order list for this account type
return getOrders(account, type)
def PUT(self, account=None, type=None, orders=None):
#Set the orders associated with account or something
setOrders(account, type, orders)
class Root(object):
pass
root = Root()
root.orders = Orders()
conf = {
'global': {
'server.socket_host': '0.0.0.0',
'server.socket_port': 8000,
},
'/': {
'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
},
}
cherrypy.quickstart(root, '/', conf)
爲什麼你要設置使用put方法我不知道訂單,但它確實給了怎麼辦PUT方法的另一個例子。你所要做的就是用PUT替換請求使用的方法,它將使用Orders的PUT()方法,並在Orders上使用常規GET,並使用GET()方法。由於POST()方法未定義,因此POST不能用於此示例。如果您嘗試POST或DELETE,您將得到「405方法不允許」。
我喜歡這種方法,因爲它很容易看到發生了什麼,我相信它會回答你的問題。
不工作的鏈接:( – 2018-01-25 09:40:18