2013-02-02 27 views
7

Tôi đang cố gắng xây dựng một trang web nhỏ với chỉ mục, v.v ... và một api mà tôi muốn trong/api.Chạy nhiều hơn một lớp trong Cherrypy

Ví dụ:

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) 

Vì vậy, tôi muốn để có thể đi đến mysite.com/contact và mysite.com/Api/putSomething

Nếu tôi sử dụng cherrypy.quickstart(Site()), tôi sẽ chỉ nhận các trang trong Trang web.

Tôi nghĩ rằng có một cách để ánh xạ lớp Api dưới/Api, nhưng tôi không thể tìm thấy nó.

Trả lời

7

Cập nhật (ngày 13 tháng 3 năm 2017): Câu trả lời ban đầu bên dưới khá lỗi thời nhưng đang rời khỏi nó vì nó phản ánh câu hỏi ban đầu đã được hỏi.

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


gốc trả lời:

Nhìn vào điều phối mặc định. The entire documentation for Dispatching.

Trích dẫn từ các tài liệu:

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

Trong ví dụ trên, URL http://localhost/onepage sẽ trỏ vào đối tượng đầu tiên và URL http://localhost/otherpage sẽ trỏ vào thứ hai. Như thường lệ, tìm kiếm này được thực hiện tự động.

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

Câu trả lời hay. Chỉ cần thêm: bạn cũng có thể gọi cherrypy.tree.mount bao nhiêu lần tùy ý thêm trình xử lý. – fumanchu

+1

liên kết thứ hai cung cấp 403 – Nate

6

Như fumanchu đề cập, bạn có thể tạo phần phụ khác nhau để trang web của bạn với nhiều cuộc gọi đến cherrypy.tree.mount. Dưới đây là một phiên bản đơn giản của một trang web mà tôi đang làm việc trên đó bao gồm cả một ứng dụng web front-end và một API yên tĩnh:

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

Tạo một thể hiện của WebService khởi hai ứng dụng web khác nhau. Đầu tiên là đơn đăng ký giao dịch người dùng của tôi, số này ở số web.Application và sẽ được phục vụ tại số /. Thứ hai là API an toàn của tôi, hoạt động tại số web.API và sẽ được phân phối tại số /api.

Hai chế độ xem có các cấu hình khác nhau. Ví dụ, tôi đã xác định rằng api sử dụng phương thức gửi đi và quyền truy cập vào nó được điều chỉnh bởi xác thực HTTP cơ bản.

Khi bạn tạo một phiên bản WebService, bạn có thể gọi bắt đầu hoặc dừng nó khi cần thiết và nó sẽ xử lý tất cả việc dọn dẹp.

Nội dung thú vị.

Các vấn đề liên quan