Python 除'以外的烧瓶路径/';不由apache提供服务

Python 除'以外的烧瓶路径/';不由apache提供服务,python,apache,flask,raspberry-pi3,wsgi,Python,Apache,Flask,Raspberry Pi3,Wsgi,所以我应该先说我对Flask、Apache和web服务还不熟悉,所以我为我的无知提前道歉 我正试图用Raspberry Pi 3建立一个远程数据记录项目。我将数据捕获到SQL数据库中,然后通过Apache以交互式绘图的形式提供这些信息 最近我一直在尝试使用flask,因为我喜欢它的灵活性。我已经成功地安装了flask和Apache,并且都提供了hello worlds服务。然后我设置了wsgi,通过Apache为flask路由提供服务,并能够让hello world正常工作。然后我成功地复制了这

所以我应该先说我对Flask、Apache和web服务还不熟悉,所以我为我的无知提前道歉

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

最近我一直在尝试使用flask,因为我喜欢它的灵活性。我已经成功地安装了flask和Apache,并且都提供了hello worlds服务。然后我设置了wsgi,通过Apache为flask路由提供服务,并能够让hello world正常工作。然后我成功地复制了这个例子(/)

然后,我想将重启按钮连接到一个烧瓶路径,该路径将实际重启Pi。我能够在开发环境“localhost:5000”中实现这一点。如果我从web导航到Pi,我可以加载sysinfo页面,但是重新启动的路径失败,出现404错误

“未找到服务器上未找到请求的URL。如果 手动输入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>
  <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>
这是我正在使用的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
如果能帮助我理解我做错了什么,我将不胜感激


-谢谢

它不起作用,因为您正在Apache中的子URL上装载应用程序,但您在Flask中的路由也有装载点。这意味着您使用的URL必须是
/sysinfo/sysinfo/restart\u now

您需要在Flask路由中使用just
/restart\u now
,或者将Apache配置更改为使用:

WSGIScriptAlias /sysinfo /var/www/sysinfo/sysinfo.wsgi/sysinfo
在最后一个参数上添加尾随的
/sysinfo
,使Flask应用程序仍然将装入点视为
路径信息的一部分,而这正是Flask路由的内容


顺便说一句,您不需要在
上重新加载wsgiscript,因为这是默认设置。

谢谢。我花了一分钟的时间,但我最终还是弄明白了这一点,回来解释,看到了你的回答。顺便问一下,调试flask/java/html代码的好方法是什么?我最后做的是制作另一个测试页面模板,然后在文本{{url_for(“restart_now”)}中打印出来,这样做之后,事情就变得很明显了。我还意识到我应该使用{{url_for(…)}}而不是directhref,并且也解决了这个问题。我在chrome>more tools>dev tools方面取得了一些成功,但我对这方面还不熟悉。
import sys
sys.path.insert(0, '/var/www/sysinfo')
from index import app as application
WSGIScriptAlias /sysinfo /var/www/sysinfo/sysinfo.wsgi/sysinfo