2013-02-02 59 views
7

我正在嘗試使用索引等構建一個小網站,並在/ api中創建一個api。在Cherrypy上運行多個類

例如:

class Site(object): 
    @cherrypy.expose 
    def index(self): 
     return "Hello, World!" 
    @cherrypy.expose 
    def contact(self): 
     return "Email us at..." 
    @cherrypy.expose 
    def about(self): 
     return "We are..." 

class Api(object): 
    @cherrypy.expose 
    def getSomething(self, something): 
     db.get(something) 
    @cherrypy.expose 
    def putSomething(self, something) 

所以,我希望能夠去mysite.com/contact和mysite.com/Api/putSomething

如果我使用cherrypy.quickstart(Site()),我只會獲得網站下的網頁。

我認爲有一種方法可以將類Api映射到/ Api下,但我無法找到它。

回答

7

更新(2017年3月13日):下面的原始答案已經過時了,但我仍然保留原來的答案,以反映原先提出的問題。

The official documentation now has a proper guide on how to achieve it.


原來的答案:

看看默認的調度。 The entire documentation for Dispatching.

從文檔引用:

root = HelloWorld() 
root.onepage = OnePage() 
root.otherpage = OtherPage() 

在上面的例子中,URL http://localhost/onepage將在 指向所述第一對象和所述URL http://localhost/otherpage將在 第二個點。像往常一樣,這個搜索是自動完成的。

This link gives even more detail on it with a complete example shown below.

import cherrypy 

class Root: 
    def index(self): 
     return "Hello, world!" 
    index.exposed = True 

class Admin: 
    def user(self, name=""): 
     return "You asked for user '%s'" % name 
    user.exposed = True 

class Search: 
    def index(self): 
     return search_page() 
    index.exposed = True 

cherrypy.root = Root() 
cherrypy.root.admin = Admin() 
cherrypy.root.admin.search = Search() 
+0

很好的答案。只需添加:您也可以多次調用cherrypy.tree.mount來添加處理程序。 – fumanchu

+1

第二個鏈接給出了403 – Nate

6

如前所述fumanchu,您可以創建不同的小節到您的站點多次調用cherrypy.tree.mount。下面是我工作的一個網站的簡化版本由兩部分組成前端Web應用程序和REST的API,:

import cherrypy 
import web 

class WebService(object): 

    def __init__(self): 
     app_config = { 
      '/static': { 
       # enable serving up static resource files 
       'tools.staticdir.root': '/static', 
       'tools.staticdir.on': True, 
       'tools.staticdir.dir': "static", 
      }, 
     } 

     api_config = { 
      '/': { 
       # the api uses restful method dispatching 
       'request.dispatch': cherrypy.dispatch.MethodDispatcher(), 

       # all api calls require that the client passes HTTP basic authentication 
       'tools.authorize.on': True, 
      } 
     } 

     cherrypy.tree.mount(web.Application(), '/', config=app_config) 
     cherrypy.tree.mount(web.API(), '/api', config=api_config) 

    # a blocking call that starts the web application listening for requests 
    def start(self, port=8080): 
     cherrypy.config.update({'server.socket_host': '0.0.0.0', }) 
     cherrypy.config.update({'server.socket_port': port, }) 
     cherrypy.engine.start() 
     cherrypy.engine.block() 

    # stops the web application 
    def stop(self): 
     cherrypy.engine.stop() 

創建的WebService實例初始化兩個不同的Web應用程序。第一個是我的前端應用程序,其生活在web.Application,並將在/服務。第二個是我的寧靜的API,它的生活在web.API,並將在/api服務。

這兩個視圖也有不同的配置。例如,我已經指定api使用方法調度,並且對它的訪問受HTTP基本身份驗證控制。

創建WebService的實例後,您可以根據需要調用啓動或停止,並負責所有清理。

很酷的東西。