Apache 未提供“/”以外的 Flask 路由
Flask routes other than '/' not being served by apache
所以我应该先说我是 Flask、Apache 和 Web 服务的新手,所以我提前为我的无知道歉。
我正在尝试使用 Raspberry Pi 设置远程数据记录项目 3. 我正在将数据捕获到 SQL 数据库,然后通过 Apache 以交互式图表的形式提供该信息。
我最近一直在尝试用 Flask 做一些事情,因为我喜欢它的灵活性。我已经成功设置了 flask 和 Apache,并且都为 hello worlds 服务。然后我设置 wsgi 以通过 Apache 为烧瓶路由提供服务,并且能够让 hello world 工作。然后我成功地复制了这个例子(PART 1 / PART 2)。
然后我想将重启按钮连接到实际上会重启 Pi 的烧瓶路由。我能够让它在开发环境中工作 'localhost:5000'。相反,如果我从 Web 导航到 Pi,我可以加载 sysinfo 页面,但是重启的路由失败并出现 404 错误。
"Not Found The requested URL was not found on the server. If you
entered the URL manually please check your spelling and try again."
以下是来自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
如果能帮助我理解我做错了什么,将不胜感激。
-谢谢
它不起作用,因为您将应用程序安装在 Apache 的子 URL 上,但您在 Flask 中的路由也有安装点。这意味着您使用的 URL 需要是 /sysinfo/sysinfo/restart_now
.
您要么只需要在 Flask 路由中使用 /restart_now
,要么更改 Apache 配置以使用:
WSGIScriptAlias /sysinfo /var/www/sysinfo/sysinfo.wsgi/sysinfo
在最后一个参数上添加尾随 /sysinfo
可以解决问题,因此 Flask 应用程序仍然将挂载点视为 PATH_INFO
的一部分,这是 Flask 路由的一部分。
顺便说一句,您不需要 WSGIScriptReloading On
,因为这是默认设置。
所以我应该先说我是 Flask、Apache 和 Web 服务的新手,所以我提前为我的无知道歉。
我正在尝试使用 Raspberry Pi 设置远程数据记录项目 3. 我正在将数据捕获到 SQL 数据库,然后通过 Apache 以交互式图表的形式提供该信息。
我最近一直在尝试用 Flask 做一些事情,因为我喜欢它的灵活性。我已经成功设置了 flask 和 Apache,并且都为 hello worlds 服务。然后我设置 wsgi 以通过 Apache 为烧瓶路由提供服务,并且能够让 hello world 工作。然后我成功地复制了这个例子(PART 1 / PART 2)。
然后我想将重启按钮连接到实际上会重启 Pi 的烧瓶路由。我能够让它在开发环境中工作 'localhost:5000'。相反,如果我从 Web 导航到 Pi,我可以加载 sysinfo 页面,但是重启的路由失败并出现 404 错误。
"Not Found The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again."
以下是来自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
如果能帮助我理解我做错了什么,将不胜感激。
-谢谢
它不起作用,因为您将应用程序安装在 Apache 的子 URL 上,但您在 Flask 中的路由也有安装点。这意味着您使用的 URL 需要是 /sysinfo/sysinfo/restart_now
.
您要么只需要在 Flask 路由中使用 /restart_now
,要么更改 Apache 配置以使用:
WSGIScriptAlias /sysinfo /var/www/sysinfo/sysinfo.wsgi/sysinfo
在最后一个参数上添加尾随 /sysinfo
可以解决问题,因此 Flask 应用程序仍然将挂载点视为 PATH_INFO
的一部分,这是 Flask 路由的一部分。
顺便说一句,您不需要 WSGIScriptReloading On
,因为这是默认设置。