Python 如何在CherryPy独立web服务器上启动瓶子应用程序?

Python 如何在CherryPy独立web服务器上启动瓶子应用程序?,python,cherrypy,bottle,Python,Cherrypy,Bottle,我有一个使用瓶子框架开发的python web应用程序。我的瓶子应用程序是web API,提供返回JSon数据的方法,因此不需要静态内容。我正在尝试使用CherryPy服务器将其部署到生产环境中,该服务器对于生产应用程序来说应该是健壮的 我的web_api.py文件(我的瓶子应用程序)如下所示: from bottle import Bottle, request app = Bottle() @app.get('/stuff') def do_stuff(): ''' Me

我有一个使用瓶子框架开发的python web应用程序。我的瓶子应用程序是web API,提供返回JSon数据的方法,因此不需要静态内容。我正在尝试使用CherryPy服务器将其部署到生产环境中,该服务器对于生产应用程序来说应该是健壮的

我的web_api.py文件(我的瓶子应用程序)如下所示:

from bottle import Bottle, request

app = Bottle()

@app.get('/stuff')
def do_stuff():
    '''
    Method that does stuff.
    '''
    stuff = {'data': 'some data'}
    # Return the environment info as Json data
    return stuff
from my_package.web_api import app
from cherrypy.wsgiserver import CherryPyWSGIServer

server = CherryPyWSGIServer(
    ('0.0.0.0', 80),
    app,
    server_name='My_App',
    numthreads=30)

server.start()
我有一个server.py文件可以在CherryPy服务器上启动瓶子应用程序,如下所示:

from bottle import Bottle, request

app = Bottle()

@app.get('/stuff')
def do_stuff():
    '''
    Method that does stuff.
    '''
    stuff = {'data': 'some data'}
    # Return the environment info as Json data
    return stuff
from my_package.web_api import app
from cherrypy.wsgiserver import CherryPyWSGIServer

server = CherryPyWSGIServer(
    ('0.0.0.0', 80),
    app,
    server_name='My_App',
    numthreads=30)

server.start()
因此,当我使用以下命令运行服务器时:

python server.py
我的服务器已成功启动,并按预期在端口80中开始侦听。然而,一旦我启动我的web服务器,我就不能再停止它了。我尝试了Ctrl+C,它可以与开发服务器一起工作,但在这里没有效果。我启动服务器的方式正确吗?一旦它运行,我如何停止它?这是通过CherryPy启动瓶子应用程序的正确方法吗


顺便说一句,我正在Windows 8中运行python 2.7。

您的代码是正确的,您只需要添加一个try/catch语句:

from my_package.web_api import app
from cherrypy.wsgiserver import CherryPyWSGIServer

server = CherryPyWSGIServer(
    ('0.0.0.0', 80),
    app,
    server_name='My_App',
    numthreads=30)

try:
    server.start()
except KeyboardInterrupt:
    server.stop()
<>你可能也想考虑做一些日志记录或类似的事情。

以下是在cherrypy中托管WSGI应用程序的三种可选方法:

import cherrypy as cp
from cherrypy.wsgiserver import CherryPyWSGIServer
from cherrypy.process.servers import ServerAdapter


from bottle import Bottle

app = Bottle()

@app.get('/stuff')
def do_stuff():
    '''
    Method that does stuff.
    '''
    stuff = {'data': 'some dataX'}
    return stuff

def run_decoupled(app, host='0.0.0.0', port=8080, **config):
    server = CherryPyWSGIServer((host, port), app, **config)
    try:
        server.start()
    except KeyboardInterrupt:
        server.stop()

def run_in_cp_tree(app, host='0.0.0.0', port=8080, **config):
    cp.tree.graft(app, '/')
    cp.config.update(config)
    cp.config.update({
        'server.socket_port': port,
        'server.socket_host': host
    })
    cp.engine.signals.subscribe() # optional
    cp.engine.start()
    cp.engine.block()

def run_with_adapter(app, host='0.0.0.0', port=8080, config=None, **kwargs):
    cp.server.unsubscribe()
    bind_addr = (host, port)
    cp.server = ServerAdapter(cp.engine,
                              CherryPyWSGIServer(bind_addr, app, **kwargs),
                              bind_addr).subscribe()
    if config:
        cp.config.update(config)
    cp.engine.signals.subscribe() # optional
    cp.engine.start()
    cp.engine.block()
_cp_树中的
run_
run_with_adapter
功能使用的是cherrypy引擎,它允许使用现成的自动重新加载、pidfile、daemonization、信号管理和其他功能,以及创建自己的功能


请注意,您还可以使用在CherryPyWSGIServer上连接多个wsgi应用程序。

2019年,在这里尝试将任何wsgi服务器连接到我的瓶装应用程序是相当棘手的(对于像我这样的noobie来说)。 我试着连接了几个,大部分时间都和CherryPy在一起,这改变了他的语法

对我来说最简单的是女服务员 在我弄明白如何在女服务员身上使用后,我也用了樱桃糖。因此:

樱桃糖

1) 导入后添加

2) 将路线“@瓶子”更改为“@app”

3) 将其添加为主要功能

女服务员

1) 导入后添加

2) 将其添加为主要功能


3) 将“瓶子”改为“@app”

哇!回答得很好@cyraxjoe,非常感谢!我花了一整天的时间寻找这些信息,但运气不好。谢谢:)顺便问一下@cyraxjoe,你有没有关于如何在像我这样的设置中使用wsgi请求记录器的示例?把瓶子放在樱桃上?我遵循了他们的文档,但我得到的是空日志。@我刚刚写了一篇关于访问/错误日志用例的详细解释。我希望你觉得这对你有帮助。棒极了,伙计,你是最棒的!任何现在(2017年)看到这个问题的人都应该被告知,这在CherryPy的最新版本中不起作用。(2017年1月),cherrypy.wsgiserver迁移至。
import waitress 

app  = bottle.Bottle()
 waitress.serve(app, listen='*:44100')