为什么我不能将消息从 flask html 发送到 flask python?

why can't I send messages from flask html to flask python?

我一直在用 flask 开发一个程序,它可以让你搜索数据库。我没有在数据库或任何其他地方编码实际发现的东西,但我现在不需要它,数据库现在不影响任何东西。我一直无法解决如何将用户在表单中输入的内容发送到 python 程序的问题。它运行没有错误,但是当我检查收到的内容时,我得到 None。我做错了什么吗?这是我的代码,很乱,只有一个文件。

main.py

from flask import Flask, render_template
from flask import request
import pdfkit, time




def go(letters):
  data = open('data.txt','r')
  return letters
  
   
app = Flask(__name__)
       
@app.route("/path/", methods=['GET','POST'])
def search():
  time.sleep(1)
  data=request.get_data()
  print(data)
  return go(data)

@app.route('/')
def index():
  
  return render_template('index.html')

if __name__ == "__main__":
    from waitress import serve
    serve(app, host="0.0.0.0", port=8080)
    app.run(debug=True)

templates/index.html

<!Doctype html!>

<html land=en>
<h1>Welcome!</h1><br>
<p>Type to search the database.</p>
<br><form name='this' onsubmit='letsgo()' class='text' action='/path/' method='post'><input id='hey' type='text'> <input type='submit' value='search'></form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
var test = document.getElementById('hey').value;
  const xhr = new XMLHttpRequest();
function letsgo() { 
  
  const data = document.getElementById("hey").value
  alert(data)
$.ajax({
  type : 'POST',
  url : "{{'https://file-encrypter.ashwinchera.repl.co/path/'}}",
  dataType: 'data',
  datas : {'data':data}
});
            

};      
</script>

另外,我正在和一个朋友一起工作,所以我不知道这里有些东西是干什么用的。有人可以告诉我如何发送这些数据吗?我一直在尝试其他问题的东西,但它们不起作用。 提前致谢!

这里有多个问题。正如评论中提到的,我建议慢慢来,把问题分解成小块。检查每个部分是否有效,然后再继续前进并积累许多难以解决的错误。

大部分问题都在前端,因此您需要使用浏览器控制台来检查错误。您还可以使用 HTML validator tool 来确保您的 HTML 有意义并捕捉 land=en.

等拼写错误

因为听起来您想 POST 不刷新页面并且您正在使用 jQuery,所以您表单上的许多属性都是不必要的:

onsubmit='letsgo()' action='/path/' method='post'

都可以去掉。当你这样做时,删除任何未使用的噪音,如:

var test = document.getElementById('hey').value;
  const xhr = new XMLHttpRequest();

和不必要的 ID 和 类。这些只是增加了混乱。当事情没有意义且不起作用时,请尝试剥离代码而不是添加代码。

"{{'https://file-encrypter.ashwinchera.repl.co/path/'}}" 应该只是 /path 这样它就可以在任何域(例如本地主机)上工作。如果你在跨源工作,那就是另一回事了,但我认为你不是。

$.ajax 调用中,datas 是一个拼写错误。那应该是 data.

const data = document.getElementById("hey").value 不是必需的。如果你懒得导入jQuery,还不如一路使用:$("#hey").val()#heyletsgo 是不明确的名称,不会使调试应用程序变得更容易。

使用 event.preventDefault() 阻止表单提交。

在后端,再次删除文件读取和 import pdfkit, time 等任何杂物和噪音。将 GET 添加到 /path 路由的可接受动词列表中似乎很奇怪(这太笼统了,就像 go 一样)。

由于您使用的是表单数据,request.get_data() 可以是 request.form.get("data"),其中 "data" 是您要从已解析表单中检索的键。

这里有一个最简单的 AJAX 示例,可以让您动起来:

templates/index.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
  <h1>Welcome!</h1>
  <p>Type to search the database.</p>
  <form>
    <input id="search-term">
    <input type="submit" value="search">
  </form>
  <div id="result"></div>

<script>
$("form").submit(function (event) {
  event.preventDefault();
  var data = $("#search-term").val();
  $.ajax({
    type: "POST",
    url: "search",
    data: {data},
    success: data => $("#result").text(data),
    error: res => console.error(res),
  });
});      
</script>
</body>
</html>

app.py:

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route("/search", methods=["POST"])
def search():
    data = request.form.get("data")
    print(data)
    return data

@app.route("/")
def index():
    return render_template("index.html")

if __name__ == "__main__":
    app.run(host="127.0.0.1", port=8080, debug=True)

如果要提交并呈现新页面,则不需要jQuery:

templates/index.html:

<!DOCTYPE html>
<html lang="en">
<body>
  <h1>Welcome!</h1>
  <p>Type to search the database.</p>
  <form action="/" method="post">
    <input name="search-term">
    <input type="submit" value="search">
  </form>
  <div>{{search_term}}</div>
</body>
</html>

app.py:

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def index():
    search_term = request.form.get("search-term", "")
    return render_template("index.html", search_term=search_term) 

if __name__ == "__main__":
    app.run(host="127.0.0.1", port=8080, debug=True)

或指向另一页:

templates/index.html:

<!DOCTYPE html>
<html lang="en">
<body>
  <h1>Welcome!</h1>
  <p>Type to search the database.</p>
  <form action="/search" method="post">
    <input name="search-term">
    <input type="submit" value="search">
  </form>
</body>
</html>

templates/search.html:

<!DOCTYPE html>
<html lang="en">
<body>
  <p>You searched: '{{search_term}}'</p>
</body>
</html>

app.py:

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route("/search", methods=["POST"])
def search():
    search_term = request.form.get("search-term", "")
    return render_template("search.html", search_term=search_term) 

@app.route("/")
def index():
    return render_template("index.html")

if __name__ == "__main__":
    app.run(host="127.0.0.1", port=8080, debug=True)