如何通过 CherryPy 独立 Web 服务器启动 Bottle 应用程序?
How to launch a Bottle application over a CherryPy standalone web server?
我有一个使用 bottle 框架开发的 python 网络应用程序。我的 Bottle 应用程序是 Web API,它提供 return JSon 数据的方法,因此不需要静态内容。我正在尝试使用 CherryPy 服务器将其部署到生产环境中,该服务器对于生产应用程序来说应该是健壮的。
我的 web_api.py 文件(我的 Bottle 应用程序)看起来像这样:
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。然而,一旦我启动了我的网络服务器,我就无法再停止它了。我试过 Ctrl + C,它可以与开发服务器一起使用,但在这里没有效果。我是否以正确的方式启动服务器?一旦 运行ning 我该如何停止它?这是通过 CherryPy 启动 Bottle 应用程序的正确方法吗?
顺便说一句,我 运行宁 python 2.7 在 Windows 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_tree
和 run_with_adapter
函数正在使用 cherrypy 引擎,这使得 plugins 的使用具有现成的自动重载、pidfile、守护进程、信号管理和更多好东西,以及创建您自己的东西的可能性。
请注意,您还可以使用 WSGIPathInfoDispatcher 在 CherryPyWSGIServer 上附加多个 wsgi 应用程序。
在 2019 年尝试将任何 WSGI 服务器连接到我的 BottlePy 应用程序被证明是相当棘手的(对像我这样的菜鸟来说)。
我尝试连接几个,大部分时间都花在 CherryPy 上,这改变了他的语法。
对我来说最简单的竟然是服务员https://waitress.readthedocs.io/en/latest/usage.html
在我弄清楚如何在女服务员身上使用它之后,我也在 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”
我有一个使用 bottle 框架开发的 python 网络应用程序。我的 Bottle 应用程序是 Web API,它提供 return JSon 数据的方法,因此不需要静态内容。我正在尝试使用 CherryPy 服务器将其部署到生产环境中,该服务器对于生产应用程序来说应该是健壮的。
我的 web_api.py 文件(我的 Bottle 应用程序)看起来像这样:
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。然而,一旦我启动了我的网络服务器,我就无法再停止它了。我试过 Ctrl + C,它可以与开发服务器一起使用,但在这里没有效果。我是否以正确的方式启动服务器?一旦 运行ning 我该如何停止它?这是通过 CherryPy 启动 Bottle 应用程序的正确方法吗?
顺便说一句,我 运行宁 python 2.7 在 Windows 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_tree
和 run_with_adapter
函数正在使用 cherrypy 引擎,这使得 plugins 的使用具有现成的自动重载、pidfile、守护进程、信号管理和更多好东西,以及创建您自己的东西的可能性。
请注意,您还可以使用 WSGIPathInfoDispatcher 在 CherryPyWSGIServer 上附加多个 wsgi 应用程序。
在 2019 年尝试将任何 WSGI 服务器连接到我的 BottlePy 应用程序被证明是相当棘手的(对像我这样的菜鸟来说)。 我尝试连接几个,大部分时间都花在 CherryPy 上,这改变了他的语法。
对我来说最简单的竟然是服务员https://waitress.readthedocs.io/en/latest/usage.html 在我弄清楚如何在女服务员身上使用它之后,我也在 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”