只是要注意安全不是问题,因为它在一个封闭的网络上,只有我可以访问 PI。
我正在尝试创建一个带有按钮的网页来运行我的 USB.py文件和USB2.py文件等
所以我安装了 flask 并启动了网页并使用此 html 加载 USB.py
我想我遇到了无法找到文件 USB.py 的问题。我已将文件放入与烧瓶相同的位置,也尝试将其放入模板中。我试过在文件所在的行 /home/joe/USB.py 中放入但它仍然出错。 我打算把它放在根目录中,但似乎有点不对。 单击服务器上的按钮时出现的错误是“GET /USB.py HTTP/1/1”404
我不是程序员,所以请不要对答案过于复杂 :)
烧瓶文件是标准的
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True, port=80, host='0.0.0.0')
HTML
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<input type="button" id='script' name="scriptbutton" value=" Run Script " onclick="goPython()">
<script src="http://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
<script>
function goPython(){
$.ajax({
url: "USB.py",
context: document.body
}).done(function() {
alert('finished python script');;
});
}
</script>
</body>
</html>
我假设您的 USB.py 文件不是您的 Flask 应用程序,而是您要基于前端触发器运行的单独应用程序。
您的 ajax 请求并不像您认为的那样运行 USB.py。如果可以,那将是一个可怕的安全漏洞。一个随机的、不受信任的客户端能够在服务器上执行任意脚本将意味着整个互联网中断,毫不夸张。
在服务器上运行应用程序的典型方法是以安全的方式公开代表客户端运行应用程序的路由。
例如,
USB1.py:
print("hello world")
app.py:
from flask import Flask, render_template
from subprocess import check_output
app = Flask(__name__)
@app.get("/run")
def run():
return check_output(["python3", "USB1.py"])
@app.get("/")
def index():
return render_template("index.html")
if __name__ == "__main__":
app.run(debug=True)
模板/index.html:
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>
<button>Run Script</button>
<script>
$("button").click(() => {
$.ajax({url: "run"})
.done(data => {
alert(data);
});
});
</script>
</body>
</html>
您可以扩展它以将查询参数传递给路由,然后再传递给您的脚本,但要小心避免允许远程代码执行。您还可以将包含更多有趣数据的 JSON 返回给客户端。
现在,上面的方法有点奇怪:我们正在运行
python3
作为python3
的子进程!根据 USB1.py 的作用,正常的方法是将其作为模块导入并调用函数,所有这些都在同一个过程中。更少的开销,更安全,更清洁。
USB1.py:
def greet():
return "hello world"
app.py:
from flask import Flask, render_template
from USB1 import greet
app = Flask(__name__)
@app.get("/run")
def run():
return greet()
@app.get("/")
def index():
return render_template("index.html")
if __name__ == "__main__":
app.run(debug=True)
相同的客户和结果。
顺便说一句,如果模板中没有动态发生,您可能希望将 index.html 作为普通静态文件提供。