"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);
});
};
これはちょっと変わったIMO ...あなたのログを見てきましたか?トレースバック?また、ルートの本体で 'pdb'を実行し、' request'オブジェクトを調べることができます(タイプ、受信データなど)。これは何が起こっているのかを知ることができます。 – danidee
ログには何もありません。トレースバック情報はありません。なぜなら、直接(python file.py)を実行しているときにしかその情報を取得できないため、エラーが発生しないからです。私はpdbを使ったことはありませんが、私はそれを調べます。 –