2013-02-02 17 views
7

मैं एक सूचकांक आदि के साथ एक छोटे साइट और एक एपीआई कि मैं/एपीआई में चाहते हैं का निर्माण करने की कोशिश कर रहा हूँ में एक से अधिक वर्ग चल रहा है।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()) उपयोग करते हैं, मैं जाने में सक्षम होना चाहते हैं आपको साइट के नीचे केवल पृष्ठ मिलेंगे।

मुझे लगता है कि/एपीआई के तहत वर्ग एपीआई मानचित्रण का एक तरीका है, लेकिन मैं यह नहीं मिल सकता है।

उत्तर

7

अपडेट (13 मार्च, 2017): नीचे दिया गया मूल उत्तर काफी पुराना है, लेकिन इसे छोड़कर मूल प्रश्न को प्रतिबिंबित करने के लिए इसे छोड़ रहा है।

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() 

उदाहरण में, यूआरएल http://localhost/onepage पर पहली वस्तु और यूआरएल 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 करने के लिए कई कॉल के साथ आपकी साइट के लिए अलग उपखंड बना सकते हैं। नीचे एक साइट है कि मैं उस पर काम कर रहा हूँ का एक सरलीकृत संस्करण दोनों सामने के अंत वेब अनुप्रयोग और एक शोकहारा एपीआई होते हैं:

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 का उदाहरण बनाकर दो अलग-अलग वेब अनुप्रयोगों initializes। पहले मेरी सामने के अंत अनुप्रयोग, जो web.Application पर रहता है और / पर परोसा जाएगा है। दूसरा मेरा आरामपूर्ण एपीआई है, जो web.API पर रहता है और /api पर कार्य किया जाएगा।

दो दृश्य अलग विन्यास भी है। उदाहरण के लिए, मैंने निर्दिष्ट किया है कि एपीआई विधि प्रेषण का उपयोग करता है, और उस तक पहुंच HTTP मूल प्रमाणीकरण द्वारा शासित है।

एक बार जब आप WebService का उदाहरण बनाते हैं, तो आप इसे आवश्यकतानुसार प्रारंभ या बंद कर सकते हैं, और यह सभी सफाई का ख्याल रखता है।

बहुत अच्छा सामान।