2016-11-03 53 views
0

我正在基于瓶的“Hello World”的例子,它可以在这里找到: https://bottlepy.org/docs/dev/tutorial.html如何使Bottle在端口已被侦听时返回错误?

from bottle import Bottle, run 

app = Bottle() 

@app.route('/hello') 
def hello(): 
    return "Hello World!" 

run(app, host='localhost', port=8080) 

我的问题是,这个代码可以运行多次,那么只有第一个实例将是一个实际上正在服务。是否有可能让程序返回一个错误来指示端口已被侦听?

+0

小建议:'return [“Hello World!”]'而不是'return“Hello World!”' –

+0

@ ron.rothman - 我刚刚复制了这个例子。为什么在这里返回一张桌子更好? – rbrtk

+0

https://github.com/PerimeterX/perimeterx-python-wsgi/issues/1 –

回答

0

在运行瓶子应用程序之前快速和肮脏的检查以查看端口是否打开可能很有用。上述

import socket 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

try: 
    s.bind(("127.0.0.1", 8000)) 
s.close() 

代码会尝试绑定到插座8000在本地主机上,如果插座已经被使用返回48错误Address already in use将失败。如果成功,那么它会关闭(取消)端口8000

+0

这是一个简单的解决方案,但我与这一个去。谢谢。 :) – rbrtk

0

选择一个空闲端口第一:

s.bind("127.0.0.1", 0) 
free_port = sock.getsockname()[1] 
s.close() 

这是容易出现竞争情况,但它不太可能打比,如果你绑定先到8000然后关闭。

0

刚捕获的错误:

运行此当口已经被绑定产量

> python test.py 
Bottle v0.12.8 server starting up (using WSGIRefServer())... 
Listening on http://localhost:8080/ 
Hit Ctrl-C to quit. 

run exited: [Errno 48] Address already in use 

虽然我承认这是我不明白你为什么要打印当你已经得到堆栈跟踪时,你自己犯的错误基本上是一样的。无论如何,上述都应该起作用。希望有所帮助!

+0

这就是问题所在 - 如果您运行多个实例,则不会出现错误。至少我没有得到一个。 :) – rbrtk