Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Release Python Flask port when script is terminated

Tags:

python

flask

I have a Python Flask server that uses HTTPS. When I press CTRL-C to terminate, the listner is still running (I have to run in the shell: sudo fuser 8080/tcp -k to kill it). I want a better way of releasing it. Anyone know the correct Flask code to use?

import sys
import os
import signal
from flask import Flask, render_template, url_for, current_app, request
from OpenSSL import SSL

# Clean-up when press CTRL+C
def signal_handler(signal, frame):
        # I want to release the port here
        print('Clean-up')
        sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)

context = SSL.Context(SSL.SSLv23_METHOD)
context.use_privatekey_file('server.key')
context.use_certificate_file('server.crt')

app = Flask(__name__)

@app.route("/<arg1>")
def route1(arg1):
    return render_template("flask_page1.html", var1=arg1)

app.run(host="0.0.0.0", port=8080, debug=False, ssl_context=context)

Python 2.7, Raspberry Pi running Raspbian

like image 992
spiderplant0 Avatar asked Aug 27 '14 20:08

spiderplant0


People also ask

How do I change my default Flask port?

Find the DEFAULT_PORT field. it is equal to 8000 by default. Change it to whatever you like DEFAULT_PORT = "8080" Restart your server: python manage.py runserver and see that it uses your set port number.


1 Answers

I exactly had the same problem with bottle, finally I ended up monkey-patching the socket module itself. Add this after your imports:

# patch socket module
socket.socket._bind = socket.socket.bind
def my_socket_bind(self, *args, **kwargs):
    self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    return socket.socket._bind(self, *args, **kwargs)
socket.socket.bind = my_socket_bind

I didn't find any other way.

like image 190
mguijarr Avatar answered Oct 20 '22 00:10

mguijarr