【问题标题】:Challenge with javascript/jquery $.get and python backendjavascript/jquery $.get 和 python 后端的挑战
【发布时间】:2019-12-28 00:48:09
【问题描述】:

我有一个 HTML 表单来输入用户名/密码来注册网站。我正在尝试实现 javascript/JQuery $.get 以发送 HTTP GET 以检查用户名是否已在使用中。在服务器端,“用户名”值(由 request.form.get() 提取)返回为 None。 javascript 源代码在 HTML 页面上似乎也没有响应。

Javascript如下:

var username = document.getElementById("username");
var inputForm = document.getElementById("form");

document.getElementById("submit").addEventListener("click", function(event) {
             event.preventDefault()
});

inputForm.onclick = function(data) {
    $.get("/check?username=" + username.value, function() {
        alert("CHECKING")
        if (data == false) {
            inputForm.submit();
        }
        else {
            alert("Sorry - that username is taken!");
        }
    });
};

后端的 Python (Flask) 如下:

@app.route("/check", methods=["GET"])
def check():
"""Return true if username available, else false, in JSON format"""

print("***RUNNING CHECK***")
# get username from web form
username = request.form.get("username")
print(username)

# check that username is longer than 1, then pull list from DB to check against
if len(username) > 1:
    usernames = db.execute("SELECT username FROM users")

# return false if username is available
if username in usernames:
    return jsonify(False)

# return true if username is NOT available
else:
    return jsonify(True)

这是回来的:

TypeError: 'NoneType' 类型的对象没有 len() INFO:werkzeug:192.168.179.21 - - [22/Aug/2019 16:20:41] "GET /check?username=ajd HTTP/1.0" 500 -

【问题讨论】:

  • 您通过QueryString 发送用户名,而不是form-data。我不知道python,但我几乎可以肯定这就是你的问题所在。可能:request.args.get('username') 而不是 request.form.get("username")

标签: javascript python flask


【解决方案1】:

我能看到的客户端问题是……

  • 检查 Javascript 控制台可能会告诉您 data 未定义。如果应该作为参数添加到回调函数中。
  • 您需要使用 encodeURIComponenet 转义 get 参数。
  • 您可能希望在收到输入而不是在单击表单时运行此代码。
username.oninput = function(data) {
  $.get("/check?username=" + encodeURIComponenet(username.value), function(data) {
    alert("CHECKING")
    if (data == false) {
      inputForm.submit();
    } else {
      alert("Sorry - that username is taken!");
    }
  });
};

【讨论】:

  • 尽管这是一些很好的建议,但它并不能解决 OPs 问题。问题在于他如何在 [python] 端点上提取数据。
  • @silentw - 我不熟悉 python,但它绝对是解决方案的一半。即使后端按预期工作,前端仍然会“无响应”,因为 data 未定义。
  • 嘿,至少 OP 发布了足够的代码来证明问题。我看到跳过导览的新用户提出了更糟糕的问题。
  • 谢谢@silentw - 使用“request.args.get”可以解决问题。我学到了一些东西!再次感谢。
猜你喜欢
  • 2023-01-24
  • 2012-07-25
  • 2018-01-21
  • 1970-01-01
  • 2012-11-06
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
相关资源
最近更新 更多