我知道"方法不允许"问题在这里已多次出现,但我相信我的情况是独一无二的,我找不到任何似乎适用于我的问题/解决方案。
我在运行Red Hat Linux v6.3的硬件服务器上运行了一个python程序。通常,此程序使用在/etc/init.d目录中启动时运行的shell脚本运行。
当通过shell脚本运行时(因为它应该运行),我的一个路由无法将信息从HTML表单发送到Python后端。给出HTTP 500错误,如果我尝试转到相关路线的地址,我会得到"方法不允许"。
但是,在尝试调试程序时,我会进入服务器,然后使用
运行程序python ts480webserver.py
程序运行正常。没有HTTP 500错误,否#34;方法不允许"错误。数据被发送到后端并再次接收,所有工作都很好。
关于什么可能导致Flask仅在shell脚本运行时访问python / applynewsettings路径时出现问题的想法,而不是直接运行时?
下面的一些代码
Shell脚本
. /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 :(得分:1)
这听起来像我以前见过的问题。
您包含的代码可能不建议它,但检查并确保如果有任何路由打开文件进行读/写,无论是从工作目录还是从shell运行,都可以解析路径脚本。
我确信在调试设置为“True”的shell脚本中运行Flask应用程序会很快暴露出500错误的原因,无论它是什么。确保之后再将其设置为“False”。