所以我应该先说这是我对Flask,Apache和网络服务的新手,所以我提前为我的无知道歉。
我正在尝试使用Raspberry Pi 3建立一个远程数据记录项目。我正在将数据捕获到SQL数据库,然后以交互式图的形式通过Apache提供该信息。
我最近一直试图用烧瓶做事,因为我喜欢它的灵活性。我已经成功设置了烧瓶和Apache,并且都服务于hello worlds。然后我设置wsgi通过Apache服务烧瓶路线,并能够让hello world工作。然后我成功地复制了这个例子(PART 1 / PART 2)。
然后我想将重启按钮连接到实际重启Pi的烧瓶路线。我能够在开发环境'localhost:5000'中使用它。如果我从Web导航到Pi,我可以加载sysinfo页面,但是重启路由失败,出现404错误。
“找不到”在服务器上找不到请求的URL。如果你找到了 手动输入网址,请检查拼写,然后重试。“
以下是index.py:
的路线@app.route("/sysinfo/restart_now", methods=['GET','POST'])
def restart_now():
subprocess.call("delayed-reboot",shell=True)
return render_template("restart_now.html")
在index.html模板中提供路径的按钮代码:
<form action="/sysinfo/restart_now" method="post">
<button name="restart_now" onclick="return confirm('Do you wish to shutdown your system ?')" class="button button-primary">Reboot Pi</button>
</form>
restart_now.html模板中的php倒计时:
<p>Sysinfo will reload automatically in <span id="counter">45</span> second(s).</p>
<script type="text/javascript">
function countdown() {
var i = document.getElementById('counter');
if (parseInt(i.innerHTML)<=0) {
location.href = '/sysinfo';
}
if (parseInt(i.innerHTML)>0) {
i.innerHTML = parseInt(i.innerHTML)-1;
}
}
setInterval(function(){ countdown(); },1000);
</script>
这是我在/ usr / local / bin中的bash脚本延迟重启:
#!/bin/bash
( sleep 5 ; sudo reboot ) &
这是我正在使用的wsgi配置:
WSGIDaemonProcess sysinfo user=pi group=www-data threads=5
WSGIScriptAlias /sysinfo /var/www/sysinfo/sysinfo.wsgi
<Directory "/var/www/sysinfo">
WSGIProcessGroup sysinfo
WSGIScriptReloading On
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
ErrorLog /var/www/sysinfo/logs/error.log
和sysinfo.wsgi文件:
import sys
sys.path.insert(0, '/var/www/sysinfo')
from index import app as application
任何帮助了解我做错了什么都将非常感激。
- 谢谢你
答案 0 :(得分:1)
它无法正常工作,因为您将应用程序安装在Apache的子URL中,但您在Flask中的路由中也有挂载点。这意味着您使用的网址必须为/sysinfo/sysinfo/restart_now
。
您需要在Flask路由中使用/restart_now
,或更改要使用的Apache配置:
WSGIScriptAlias /sysinfo /var/www/sysinfo/sysinfo.wsgi/sysinfo
在最后一个参数上添加尾随/sysinfo
会使事情发生变化,以便Flask应用程序仍然将挂载点视为PATH_INFO
的一部分,这就是Flask路由的位置。
顺便说一下,你不需要WSGIScriptReloading On
因为这是默认值。