【问题标题】:Running Python Function from HTML/Flask从 HTML/Flask 运行 Python 函数
【发布时间】:2021-03-10 19:54:11
【问题描述】:

我一直在用头撞墙来解决这个问题。我正在编写一个应用程序,理想情况下,当 HTML 中发生 onclick 时,它会运行来自 FLASK 的 python 脚本。问题是我所做的一切似乎都不起作用。我不再收到错误,但程序没有运行。

我尝试通过 AJAX 访问 python 脚本,我尝试通过 HTML 中的 jscript 调用 python 脚本,我为 python 脚本创建了一个单独的文件,而不是通过 Flask 运行它......

</style>
<h1>Book Roulette</h1>
<h2>Discover Something New</h2>
<h3>Click the image to download a surprise book</h3>
<a href="/static/gut.py"> <button class="button" style="background: url(/static/images/stack.jpg)" onclick="button();" action="/button"></a>
</button>
<script>

$(function() {
    $('button').click(function() {
        $.ajax({
            url: 'static/gut.py',
            data: $('form').serialize(),
            type: 'POST',
            success: function(response) {
                console.log(response);
            },
            error: function(error) {
                console.log(error);
            }
        });
    });
});

</script>
</body>
</html>

这是我的 Flask/Python 文档

from flask import Flask, render_template
from gutenberg.acquire import load_etext
from gutenberg.cleanup import strip_headers
import random


app = Flask(__name__, static_url_path='/static')



@app.route('/books')
def books():
    return render_template("main.html")


@app.route('/button', methods=["GET", "POST"])
def button():
    f = open("GutProject.txt", "w")
    for x in range(1):
        y = (random.randint(0, 59000))
        text = strip_headers(load_etext(y)).strip()
        f.write(text)



if __name__ == "__main__":
    app.run(debug=True)

我想要做的是当我单击 HTML 按钮在用户计算机上生成一个新文件时运行 python 代码。到目前为止,我已经达到了单击按钮时没有任何反应的地步。

【问题讨论】:

  • 您查看过浏览器的开发者工具吗?您可以按 F12 打开它们。转到“控制台”选项卡。有错误信息吗?

标签: python jquery html flask


【解决方案1】:

您实际上想要在这里实现的是创建一个客户端/服务器项目。您的 html 是您的客户端或前端,python 是您的服务器或后端。使两者通信的方式是通过一个api。然后,您应该预先启动 Flask 应用程序,而不是从前端调用脚本,而是将请求发送到正确的端点。假设您在本地计算机上的默认端口上运行 Flask,请尝试在前端将 url: 'static/gut.py' 替换为以下值: url: 'http://localhost:5000/button'

这应该会在您单击按钮时触发相关功能。

【讨论】:

  • $(function() { $('button').click(function() { $.ajax({ url:'localhost:5000/button', data: $('form').serialize (), 类型: 'POST', 成功: function(response) { console.log(response); }, error: function(error) { console.log(error); } }); }); });
  • 在打开 html 页面之前,您是否从终端启动了您的烧瓶服务器?如果是,终端上的输出是什么?
  • 这是我加载页面并单击按钮时的完整输出
  • * Serving Flask app "app"(延迟加载) * 环境:生产 警告:不要在生产环境中使用开发服务器。请改用生产 WSGI 服务器。 * 调试模式:开 * 在127.0.0.1:5000 上运行(按 CTRL+C 退出) * 使用 stat 重新启动 * 调试器处于活动状态! * 调试器 PIN:284-389-406 127.0.0.1 - - [10/Aug/2019 12:46:18] “GET /books HTTP/1.1”200 -
【解决方案2】:

对于您想要实现的功能,您需要在 Flask 应用程序之外添加第二台服务器。因为POST 请求需要由已经运行的 Web 应用程序处理,所以如果没有第二个服务接收此POST 请求并将您的 Flask 应用程序作为子进程运行,就不可能实现您的目标。

【讨论】:

  • 我该怎么做?
  • 它可以是一个 Flask 应用程序,在一个路由中,使用 subprocess 模块来生成第二个 Flask 应用程序的进程(参见 stackoverflow.com/questions/24787106/…)。无论如何,这个用例听起来有点倒退,所以我会探索其他方法。我无法提出任何建议,因为我不知道这里的最终目标是什么。
【解决方案3】:

更新:我实际上设法在不使用 jquery 或 PHP 的情况下解决了这个问题。

</script>
<a href="/roulette"><input type="button" name="button" class="button" style="background: url(/static/images/stack.jpg)"></input></a>
</body>
</html>

谢谢你们的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2016-09-27
    相关资源
    最近更新 更多