Jetzt, Normalerweise führen Sie eine Flask-App in einem separaten Terminal über py flask.py aus und müssen sie manuell hochfahren und mit Strg-C manuell deaktivieren. Meine Python-App benötigt diesen lokalen Server nur in bestimmten Fällen, zum Beispiel, um mithilfe des Autorisierungscode-Flows von Spotify ein Token zu erhalten, damit ich später über deren Web-API gültige Anfragen stellen kann.
Mein < Die Datei em>auth_server.py ist der „Abschnitt“, der für all dies verantwortlich ist. Hier lebt eine Klasse namens LocalServerThread, die Thread unterordnet und wörtlich aus dieser Antwort übernommen wurde. Vor 8 Jahren war dies die einzige brauchbare Antwort für Windows in einem Meer von Scheiße; Leider ist es heute nur noch ein teilweise funktionsfähiges Exemplar.
Hier ist es in seiner vollen Pracht:
Code: Select all
from werkzeug.serving import make_server
class ServerThread(threading.Thread):
THREAD_NAME = 'LocalServerThread'
def __init__(self, app):
threading.Thread.__init__(self, name=LocalServerThread.THREAD_NAME)
self.server = make_server('127.0.0.1', 8080, app)
self.ctx = app.app_context()
self.ctx.push()
def run(self):
log.info('starting server')
self.server.serve_forever()
def shutdown(self):
self.server.shutdown()
def start_server():
global server
app = flask.Flask('myapp')
# App routes defined here
server = ServerThread(app)
server.start()
log.info('server started')
def stop_server():
global server
server.shutdown()
Code: Select all
def start_local_http_server():
app = Flask(__name__)
@app.route('/')
def home():
@app.route('/login')
def login():
@app.route('/callback')
def callback():
global server
server = LocalServerThread(app)
server.start()
print(fr'Started {LocalServerThread.THREAD_NAME}, serving: http://127.0.0.1:8080')
def stop_local_http_server():
server.shutdown()
Code: Select all
if not auth_server.validate_token(reject=True):
auth_server.start_local_http_server()
time.sleep(4)
auth_server.stop_local_http_server()
print('Finally Done')
Ich reite es mit py ./main.py. Wenn ich es einfach laufen lasse, funktioniert das Herunterfahren perfekt und schließe alles richtig. Gut. erfolgreich dient mir die Seite, und wenn das Programm self.server.shutdown () erreicht ist, hängt es dort nur zwischen 90 und 300 Sekunden, bevor er schließlich den Druck ('endlich')