Neel
Neel

Reputation: 21297

How to stop the bottle server if port is not available?

I am using bottlepy to develop my app. Using paste as server.

from bottle import route, run, template

@route('/hello/<name>')
def index(name):
        return template('<b>Hello {{name}}</b>!', name=name)

run(host='localhost',
    port=8080,
    debug=True,
    reloader=True,
    server='paste')

If one of the other services is running on same port 8080, I got message

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

Traceback (most recent call last):
  File "/Users/test/venv/lib/python2.7/site-packages/bottle.py", line 3113, in run
    server.run(app)
  File "/Users/test/venv/lib/python2.7/site-packages/bottle.py", line 2812, in run
    **self.options)
  File "/Users/test/venv/lib/python2.7/site-packages/paste/httpserver.py", line 1310, in serve
    request_queue_size=request_queue_size)
  File "/Users/test/venv/lib/python2.7/site-packages/paste/httpserver.py", line 1153, in __init__
    request_queue_size=request_queue_size)
  File "/Users/test/venv/lib/python2.7/site-packages/paste/httpserver.py", line 1132, in __init__
    request_queue_size=request_queue_size)
  File "/Users/test/venv/lib/python2.7/site-packages/paste/httpserver.py", line 345, in __init__
    HTTPServer.__init__(self, server_address, RequestHandlerClass)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 420, in __init__
    self.server_bind()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py", line 108, in server_bind
    SocketServer.TCPServer.server_bind(self)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 434, in server_bind
    self.socket.bind(self.server_address)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 48] Address already in use
Bottle v0.12.8 server starting up (using PasteServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

Traceback (most recent call last):
  File "/Users/test/venv/lib/python2.7/site-packages/bottle.py", line 3113, in run
    server.run(app)
  File "/Users/test/venv/lib/python2.7/site-packages/bottle.py", line 2812, in run
    **self.options)
  File "/Users/test/venv/lib/python2.7/site-packages/paste/httpserver.py", line 1310, in serve
    request_queue_size=request_queue_size)
  File "/Users/test/venv/lib/python2.7/site-packages/paste/httpserver.py", line 1153, in __init__
    request_queue_size=request_queue_size)
  File "/Users/test/venv/lib/python2.7/site-packages/paste/httpserver.py", line 1132, in __init__
    request_queue_size=request_queue_size)
  File "/Users/test/venv/lib/python2.7/site-packages/paste/httpserver.py", line 345, in __init__
    HTTPServer.__init__(self, server_address, RequestHandlerClass)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 420, in __init__
    self.server_bind()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py", line 108, in server_bind
    SocketServer.TCPServer.server_bind(self)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 434, in server_bind
    self.socket.bind(self.server_address)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 48] Address already in use
Bottle v0.12.8 server starting up (using PasteServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

Its continuing and not stoping, I can add try...catch.. and catch this exception and kill the process. But before that, I want to know that, is there any parameter which I can pass and this stops automatically?

If I set reloader=False then it works. Is there any way to make this works with reloader=True?

I read, and reloader is for auto reload, if file change, but if port is not available then also its trying to restart server.

Upvotes: 2

Views: 411

Answers (1)

Peleg
Peleg

Reputation: 159

how about this one:

import socket
def is_port_in_use(port):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        return s.connect_ex(('localhost', port)) == 0
if not is_port_in_use(8080):
    run(host='localhost',
    port=8080,
    debug=True,
    reloader=True,
    server='paste')

for python 2.7 use:

from contextlib import closing
import socket
def is_port_in_use(port):
    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
        return s.connect_ex(('localhost', port)) == 0

Upvotes: 2

Related Questions