如何通过CherryPy独立Web服务器启动Bottle应用程序?

时间:2015-02-03 20:18:47

标签: 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():
    '''
    Method that does stuff.
    '''
    stuff = {'data': 'some data'}
    # Return the environment info as Json data
    return stuff

我有一个server.py文件,可以通过CherryPy服务器启动Bottle应用程序,如下所示:

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启动Bottle应用程序的正确方法吗?

BTW,我在Windows 8中运行python 2.7。

2 个答案:

答案 0 :(得分:8)

您的代码是正确的,您只需要添加一个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()

您可能还想考虑使用wsgi-request-logger或类似内容进行日志记录。

这是在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()

run_in_cp_treerun_with_adapter函数正在使用cherrypy引擎,它允许使用plugins进行现成的自动重载,pidfile,守护进程,信号管理和一些更好的东西,以及创建自己的东西的可能性。

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

答案 1 :(得分:0)

尝试在2019年将任何WSGI服务器连接到我的BottlePy应用程序都非常棘手(对于像我这样的noobie)。 我尝试连接多个服务器,并花了大部分时间在 CherryPy 上,这改变了他的语法。

对我来说,最简单的是女服务员https://waitress.readthedocs.io/en/latest/usage.html 在我弄清楚如何在女服务员上使用它后,我也得到了樱桃皮。所以:

CherryPy http://docs.cherrypy.org/en/latest/advanced.html?highlight=WSGi#host-a-foreign-wsgi-application-in-cherrypy

1) 导入后添加

import cherrypy as cp

app  = bottle.Bottle()

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

3) 将此添加为主要功能

 cp.tree.graft(app, '/')
 cp.server.start()

女服务员

1) 导入后添加

import waitress 

app  = bottle.Bottle()

2) 将此添加为主要功能

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

3) 将路线“ @bottle”更改为“ @app”