如何在不刷新页面的情况下将 python 输出发送回 html?

How to send python output back to html without refreshing the page?

所以我试图制作一个代码编辑器并处理来自用户输入的代码,就像大多数竞争性编码网站的工作方式一样。我会展示相关部分。

我在 python 上使用了 codemirror 和 Flask,在页面中创建了一个代码编辑器,使用 js 从按钮 onclick 获取用户输入并使用 ajax 将代码发送回我的 python 脚本,并说我处理了我的数据并生成了输出,现在我坚持尝试将数据发送回 html 页面(可能就像在另一个代码块中显示输出到用户)

html 代码块的代码以及我尝试发回数据的尝试: py-tut.html

        <div class="codeblock">
            <p>Python editor</p>
            <code><textarea type="text" class="code" id="code" spellcheck="false"></textarea></code>
            <script>
                var codebox = CodeMirror.fromTextArea(document.getElementById("code"), {
                    mode: "python",
                    theme: 'dracula',
                    indentUnit: 4,
                    lineNumbers: 1
                });
                {#set any values in the text box#}
                codebox.getDoc().setValue("import random")
            </script>
            <div class="console" id="console"></div>
            <button type="submit" class="submit" onclick="submit()">Submit</button>
            <script>
                function submit() {
                    var c = codebox.getValue()
                    $.post('http://127.0.0.1:8000/get_code/', {c}, function(){
                        {#this is the part where Im stuck at#}
                        document.getElementById("console").innerHTML = {{ code }};
                    })
                }
            </script>
        </div>

下面是 Flask 部分的代码: website.py

@app.route("/get_code/", methods=["GET", "POST"])
def get_code():
    if request.method == "POST":
        code = request.form.getlist('c')[0]
        print(code)
        return render_template("py-tut.html", code = "code")

网站的实际外观如下:

主要问题是我无法在处理后将数据发送回 html,我尝试了 render_template、url_for、重定向,但每次我点击提交按钮,没有任何反应。 请帮忙

这是一个未经测试的简短版本。它依赖于 JQuery 库。

可以从 onclick 事件触发页面的以下脚本部分。它运行 fetch request. It should pick up your user-inputted code, or whatever you wish to transmit to the back-end. It is POST data, so content will be contained within the request (as JSON using stringify).

<script>
  let api_submit = function() {
    fetch('{{ url_for('get_code') }}', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json;charset=utf-8'
      },
      body: JSON.stringify($('.code').html())
    })
    .then( response => response.json() )
    .then( function (result) {
      $('.console').html(result.code);
    });
  };
</script>

这是处理 POSTed 数据的后端路由。内容需要从JSON转换而来。 flask render_template 使用 Jinja 构建响应,然后将此响应数据以 python dict 的形式发送回客户端(一个名为 'code' 的 dict 元素)。方便的是,在 flask 中,在服务器对 POST 请求的响应中,字典会自动转换为 JSON。

@app.route("/get_code/", methods=["GET", "POST"])
def get_code():
  if request.method == "POST":
    post_data = request.get_json()
    code = post_data.get('code')
    return dict(code=render_template("py-tut.html", code=code))
  # you may need to cater for 'GET' accesses from somewhere

看看是否可行。