151

フラスコスクリプトを使ってフラスコアプリケーションを停止できるコマンドを実装したいです。私はしばらくの間解決策を探しました。フレームワークは API を提供していないため、app.stop()これをどのようにコーディングするかについて興味があります。私は Ubuntu 12.10 と Python 2.7.3 に取り組んでいます。

4

16 に答える 16

179

デスクトップでサーバーを実行しているだけの場合は、エンドポイントを公開してサーバーを強制終了できます (詳細はShutdown The Simple Serverを参照)。

from flask import request
def shutdown_server():
    func = request.environ.get('werkzeug.server.shutdown')
    if func is None:
        raise RuntimeError('Not running with the Werkzeug Server')
    func()
    
@app.get('/shutdown')
def shutdown():
    shutdown_server()
    return 'Server shutting down...'
    

これは、より封じ込められた別のアプローチです。

from multiprocessing import Process

server = Process(target=app.run)
server.start()
# ...
server.terminate()
server.join()

これが役立つかどうか教えてください。

于 2013-06-11T20:47:13.663 に答える
26

これは少し古いスレッドですが、基本的なフラスコ アプリを実験、学習、またはテストしている人が、バックグラウンドで実行されるスクリプトから開始した場合、それを停止する最も簡単な方法は、アプリを実行しているポートで実行されているプロセスを強制終了することです。の上。注: 作成者がアプリを強制終了または停止しない方法を探していることは承知しています。しかし、これは学習している人を助けるかもしれません。

sudo netstat -tulnp | grep :5001

このようなものが得られます。

tcp 0 0 0.0.0.0:5001 0.0.0.0:* リッスン 28834/python

アプリを停止するには、プロセスを強制終了します

sudo kill 28834
于 2018-07-23T01:54:38.377 に答える
20

私の方法はbash端末/コンソールから進めることができます

1) 実行してプロセス番号を取得する

$ ps aux | grep yourAppKeywords

2a) プロセスを強制終了する

$ kill processNum

2b)上記が機能しない場合はプロセスを強制終了します

$ kill -9 processNum
于 2016-08-19T06:57:29.413 に答える
13

他の人が指摘したようにwerkzeug.server.shutdown、リクエストハンドラーからのみ使用できます。別の機会にサーバーをシャットダウンする唯一の方法は、自分自身にリクエストを送信することです。たとえば、/kill次のスニペットのハンドラーは、次の 1 秒間に別のリクエストが来ない限り、開発サーバーを強制終了します。

import requests
from threading import Timer
from flask import request
import time

LAST_REQUEST_MS = 0
@app.before_request
def update_last_request_ms():
    global LAST_REQUEST_MS
    LAST_REQUEST_MS = time.time() * 1000


@app.post('/seriouslykill')
def seriouslykill():
    func = request.environ.get('werkzeug.server.shutdown')
    if func is None:
        raise RuntimeError('Not running with the Werkzeug Server')
    func()
    return "Shutting down..."


@app.post('/kill')
def kill():
    last_ms = LAST_REQUEST_MS
    def shutdown():
        if LAST_REQUEST_MS <= last_ms:  # subsequent requests abort shutdown
            requests.post('http://localhost:5000/seriouslykill')
        else:
            pass

    Timer(1.0, shutdown).start()  # wait 1 second
    return "Shutting down..."
于 2014-11-06T19:59:15.707 に答える
6

リクエストとレスポンスの処理の外にいる場合でも、次のことができます。

import os
import signal

sig = getattr(signal, "SIGKILL", signal.SIGTERM)
os.kill(os.getpid(), sig)
于 2020-06-11T10:47:32.160 に答える