除了'/'之外的烧瓶路线不是由apache提供的

时间:2018-01-08 15:37:24

标签: python apache flask raspberry-pi3 wsgi

所以我应该先说这是我对Flask,Apache和网络服务的新手,所以我提前为我的无知道歉。

我正在尝试使用Raspberry Pi 3建立一个远程数据记录项目。我正在将数据捕获到SQL数据库,然后以交互式图的形式通过Apache提供该信息。

我最近一直试图用烧瓶做事,因为我喜欢它的灵活性。我已经成功设置了烧瓶和Apache,并且都服务于hello worlds。然后我设置wsgi通过Apache服务烧瓶路线,并能够让hello world工作。然后我成功地复制了这个例子(PART 1 / PART 2)。

enter image description here

然后我想将重启按钮连接到实际重启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

任何帮助了解我做错了什么都将非常感激。

- 谢谢你

1 个答案:

答案 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因为这是默认值。