首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在CherryPy独立的web服务器上启动瓶子应用程序?

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

Stack Overflow用户
提问于 2015-02-03 20:18:47
回答 2查看 7.4K关注 0票数 3

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

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

代码语言:javascript
复制
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服务器上启动瓶子应用程序,如下所示:

代码语言:javascript
复制
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()

因此,当我使用以下命令运行服务器时:

代码语言:javascript
复制
python server.py

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

顺便说一下,我在Windows 8中运行python2.7。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-04 01:11:52

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

代码语言:javascript
复制
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-请求记录器或其他类似的方法进行日志记录。

这是在cherrypy中托管WSGI应用程序的三种替代方法:

代码语言:javascript
复制
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引擎,这使得插件能够使用现成的自动重新加载、pidfile、守护、信号管理和一些更好的功能,以及创建自己的工具的可能性。

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

票数 10
EN

Stack Overflow用户

发布于 2019-03-12 14:18:28

试图在2019年将任何WSGI服务器连接到我的BottlePy应用程序,结果都是相当棘手的(对像我这样的noobie )。我试着连接几个,大部分时间都花在了CherryPy上,这改变了他的语法。

对我来说,最简单的就是服务员https://waitress.readthedocs.io/en/latest/usage.html,在我知道如何在服务员身上使用它之后,我也在cherrypy中得到了它。所以:

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

1)在导入后添加

代码语言:javascript
复制
import cherrypy as cp

app  = bottle.Bottle()

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

3)将其添加为主函数

代码语言:javascript
复制
 cp.tree.graft(app, '/')
 cp.server.start()

女服务员

1)在导入后添加

代码语言:javascript
复制
import waitress 

app  = bottle.Bottle()

2)将其添加为主函数

代码语言:javascript
复制
 waitress.serve(app, listen='*:44100')

( 3) 将路线“@瓶”改为"@app"

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28307981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档