如何从另一个脚本启动Bottle作为守护进程?

时间:2013-12-11 09:39:07

标签: python multiprocessing daemon bottle

我想使用BottlePy作为从另一个脚本启动的守护进程,我遇到了将独立脚本(webserver.py)转换为类的问题。我的网络服务器的独立版本可以正常工作:

import bottle

@bottle.get('/hello')
def hello():
    return 'Hello World'

@bottle.error(404)
def error404(error):
    return 'error 404'

bottle.run(host='localhost', port=8080)

我现在的意图是从下面的主脚本

开始
from webserver import WebServer
from multiprocessing import Process

def start_web_server():
    # initialize the webserver class
    WebServer()

# mainscript.py operations
p = Process(target=start_web_server)
p.daemon = True
p.start()
# more operations

其中WebServer()位于天真的现在修改过的webserver.py

import bottle

class WebServer():
    def __init__(self):
        bottle.run(host='localhost', port=8080)

    @bottle.get('/hello')
    def hello(self):
        return 'Hello World'

    @bottle.error(404)
    def error404(self, error):
        return 'error 404'

什么有用:整个事情开始,网络服务器正在监听

什么行不通:在调用http://localhost:8080/hello

127.0.0.1 - - [11/Dec/2013 10:16:23] "GET /hello HTTP/1.1" 500 746
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\bottle.py", line 764, in _handle
    return route.call(**args)
  File "C:\Python27\lib\site-packages\bottle.py", line 1575, in wrapper
    rv = callback(*a, **ka)
TypeError: hello() takes exactly 1 argument (0 given)

我的问题是:

  • 我希望将哪种参数传递给hello()error404()
  • 我应该怎么做才能参数化@bottle.get('/hello')?我希望有@bottle.get(hello_url)之类的内容,但应该在哪里初始化hello_url = '/hello'? (self.hello_url
  • 不知道@bottle.get

编辑:在准备这个问题的分支来处理问题2(关于参数化)时,我有一个顿悟并尝试了明显的解决方案(下面的代码)。我还不习惯上课,所以我没有反应在类的范围内添加变量。

# new code with the path as a parameter
class WebServer():

    myurl = '/hello'

    def __init__(self):
        bottle.run(host='localhost', port=8080, debug=True)

    @bottle.get(myurl)
    def hello():
        return 'Hello World'

    @bottle.error(404)
    def error404(error):
        return 'error 404'

1 个答案:

答案 0 :(得分:1)

  

我希望将哪种参数传递给hello()和error404()?

答案简短:没有。只需删除self即可开始使用。

@bottle.get('/hello')
def hello():
    return 'Hello World'

@bottle.error(404)
def error404(error):
    return 'error 404'

  

我应该怎么做才能参数化@ bottle.get('/ hello')?一世   想要像@ bottle.get(hello_url)这样的东西   应该初始化hello_url ='/ hello'吗? (self.hello_url不详   到@ bottle.get)

我可以通过几种不同的方式解释这一点,所以我不确定如何帮助你。但由于这是一个完全独立的问题(可能有更大的范围),请考虑在一个新的,单独的SO问题中提出它。