Теперь, Обычно вы запускаете приложение Flask в отдельном терминале через py flask.py , необходимо вручную развернуть его и вручную выключить с помощью ctrl-c . Мое приложение Python требует только этого локального сервера в определенных случаях, например: для получения токена с использованием потока кода авторизации Spotify, чтобы позже я мог сделать допустимые запросы, используя их веб -API. < /P>
my < em> auth_server.py файл является «разделом», ответственным за все это. Здесь живет класс под названием localerverthread , этот подклассы Thread , взятый из слов для слов из этого ответа. 8 лет назад это был единственный полезный ответ для окон в море дерьма; Увы, к сожалению, сегодня это всего лишь частично работающий пример.
Код: Выделить всё
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
Мобильная версия