2017-01-27 11 views
0

"Method Not Allowed"という質問がここに数回出現していることを認識していますが、私の状況は一意だと思っています。解決策は私に当てはまるようです。Python/Flask Method Not Allowedエラー(シェルスクリプトでプログラムを実行している場合のみ)

Red Hat Linux v6.3を実行しているハードウェアサーバー上で実行されているPythonプログラムがあります。通常、このプログラムは/etc/init.dディレクトリ内の起動時に実行されるシェルスクリプトを使用して実行されます。

(実行されるはずの)シェルスクリプトを実行すると、私のルートの1つでは、HTMLフォームからPythonバックエンドに情報を送信できません。 HTTP 500エラーを表示し、問題のルートのアドレスに移動しようとすると、「メソッドが許可されません」というメッセージが表示されます。プログラムをデバッグしようとしたとき

はしかし、私は、サーバーにSSH、および

python ts480webserver.py 

を使用してプログラムを実行し、プログラムが正常に動作します。 HTTP 500エラーはありません。「メソッドが許可されていません」というエラーはありません。データはバックエンドに送信され、再び受信され、すべて正常に動作します。

Python/applynewsettingsルートにアクセスしているFlaskに問題が発生する原因は、直接実行されたときではなく、シェルスクリプトによって実行されたときだけです。

シェルスクリプト

. /etc/rc.d/init.d/functions 

RETVAL=0 
PIDFILE=/var/run/ts480webserver.pid 

prog=ts480webserver.py 
exec=/srv/www/htdocs/$prog 
lockfile=/var/lock/subsys/$prog 

# Source config 
if [ -f /etc/sysconfig/$prog ] ; then 
    . /etc/sysconfig/$prog 
fi 


start() { 
    [ -x $exec ] || exit 5 
    logger -t TS480 "TS480 web server boot up" 
    echo -n $"Starting TS480 Web Server: " 
    daemon --pidfile="$PIDFILE" "$exec -i $PIDFILE </dev/null >/dev/null 2>&1 &" 
    RETVAL=$? 
    echo 
    [ $RETVAL -eq 0 ] && touch $lockfile 
} 

Pythonの

@app.route("/applynewsettings", methods=['POST', 'GET']) 
def apply_new_settings(): 

    # TAKES IN JSON with user input data from front end 
    if request.method == 'POST': 
     sys_settings = request.json 

    # PARSES it to get important info (not shown) 

    # SEND CMD (string based on user input) to CLI via Telnet 
    cli.sendCmd(sia_cmd) 

    # RETURN string reporting any validation errors that occured to show to front end 
    return sia_err_msg 

以下にいくつかのコードのJavascript

apply_settings_config_accordion = function(callback){ 
    mtu = $("#MTU-dropdown option:selected").text() 
    interface_selected = $("#interface-dropdown option:selected").text() 
    ip_address = $("#sysconfig-ip-address-input").val(); 
    subnet_mask = $("#sysconfig-subnet-input").val(); 
    gateway = $("#sysconfig-gateway-input").val(); 

    settings = {"mtu": mtu, "ip_address": ip_address, "subnet_mask": subnet_mask, "gateway": gateway, "interface": interface_selected} 
    console.log("settings: \t"+JSON.stringify(settings)); 

    $.ajax({ 
     method: "POST", 
     contentType: 'application/json', 
     url: "/applynewsettings", 
     data: JSON.stringify(settings) 
    }) 
    .done(function(sysconfig_err_msg){ 
    sysconfig_err_msg = sysconfig_err_msg.replace(/\n/g, "<br>") //String.fromCharCode(13) 
    $("#static-ip-input-err").html(sysconfig_err_msg); 

    setTimeout(function(){ load_settings_config(); }, 1000); 

    }); 
}; 
+0

これはちょっと変わったIMO ...あなたのログを見てきましたか?トレースバック?また、ルートの本体で 'pdb'を実行し、' request'オブジェクトを調べることができます(タイプ、受信データなど)。これは何が起こっているのかを知ることができます。 – danidee

+0

ログには何もありません。トレースバック情報はありません。なぜなら、直接(python file.py)を実行しているときにしかその情報を取得できないため、エラーが発生しないからです。私はpdbを使ったことはありませんが、私はそれを調べます。 –

答えて

1

これは私が以前見た問題とまったく同じです。

あなたが含まれているコードは、それを示唆するものではありませんが、作業ディレクトリから実行するかどうかに関係なく、パスを読み書きするファイルを開くルートがあればシェルスクリプト。

"真"に設定されたデバッグを使用してFlaskアプリケーションを実行すると、あなたの500エラーの原因をすばやく公開することができます。後で "False"に戻すようにしてください。

関連する問題