Теперь, обычно вы запускаете приложение Flask в отдельном терминале через py flask.py, при этом его нужно вручную развернуть и выключить с помощью Ctrl-C. Моему приложению Python этот локальный сервер нужен только в определенных случаях, например: для получения токена с помощью потока кода авторизации Spotify, чтобы я мог позже делать действительные запросы с помощью их веб-API.
Мой < Файл em>auth_server.py — это «раздел», отвечающий за все это. Здесь находится класс с именем LocalServerThread, который является подклассом Thread, взятым дословно из этого ответа. 8 лет назад это был единственный полезный ответ для Windows в море дерьма; увы, к сожалению, на сегодняшний день это лишь частично работающий пример.
Вот он во всей красе:
Код: Выделить всё
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()
Код: Выделить всё
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()
Код: Выделить всё
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')
Я запускаю его с py ./main.py. Если я просто позволю ему работать, выключение будет работать отлично, правильно закрыв все. Хорошо.
Однако, если, в то время как основной поток спит за эти 4 секунды, я перехожу на любой из маршрутов ('/', '/login', '/callback') и сервера Успешно обслуживает мне страницу, а затем, когда программа достигает самостоятельного. SELU.Server.shutdown () , она просто будет зависать там где-нибудь от 90-300 секунд, прежде чем, наконец, выходит и достигнет печати («Наконец-то сделано») Вернуться в главную ветку. В течение этого времени терминал будет выглядеть так, отказываясь позволить программе выходить из программы:
< /p>
Это бельет в белье. Я не могу понять, что, черт возьми, идет во время отладки. self.server.shutdown () углубляется в socketserver.py baseServer shutdown (), и я не могу войти в Что -то дальше, чем две строки внутри, как будто оно что -то ждет ... но я получил вам стек вызовов: < /p>
Это стеки вызовов рядом, прямо перед Отладка теряет отслеживание того, что происходит.
First: Standard Run. ________________________ Второе: переход на '/' во время сон 4sec:
Примечание: < /strong> еще раз, я нахожусь в Windows.
Есть ли кто -нибудь, кто смотрит на это, у которого есть знания /опыт, чтобы увидеть проблему? Это действительно поможет не только мне, но и наше потомство, я подозреваю ...
Подробнее здесь: https://stackoverflow.com/questions/793 ... unresponsi
Мобильная версия