Flask 函数的 POST 方法在“提交”事件中将从 JavaScript(通过 POST)作为 JSON 接收的变量重置为 None。我怎样才能避免这种情况?

Flask function's POST method is resetting variables received from JavaScript (via POST) as JSON to None on "submit" event. How can I avoid that?

提问人:Rishikesh Negi 提问时间:10/20/2023 最后编辑:Rishikesh Negi 更新时间:10/20/2023 访问量:46

问:

我正在尝试从 flask 路由中的 flask 函数(使用 )的 POST 方法访问 JavaScript 变量,并将其值存储在该 flask 函数的局部变量中。request.get_json()

在 JS 文件中,我使用了一个函数,该函数使用 Ajax 和 jQuery 通过 POST 方法将这些变量发送到该端点。在该模板上发生最终的“submit”事件之前,它被调用。

flask 函数确实接收到正确的值,并按预期将它们存储在这些局部变量中。在“submit”上,flask 函数还会在“submit”事件触发的最终 POST 方法期间通过 POST 从相应的模板获取表单,但保存 JavaScript 变量值的局部变量将重置为“None”。

据我了解,有两个 POST 方法被触发,一个由 Ajax 请求触发,另一个由 flask 中模板的最终“submit”事件触发。在最终的“submit”事件期间,flask 函数不会像在最终的 POST 方法中那样接收 JavaScript 变量,这就是 flask 中的局部变量获取 None 值的原因。我正在尝试做这样的事情:request.content_typeapplication/x-www-form-urlencoded

烧瓶路线和功能:

@app.route("/foo", methods=["GET", "POST"])
@login_required
def foo():
    if request.method == "POST":
        def getJsVars():
            if request.content_type == 'application/json':
                jsVars = request.get_json()
                return jsVars

        def getX(jsonXY):
            if request.content_type == 'application/json':
                x = jsonXY['valueX']
                return x

        def getY(jsonXY):
            if request.content_type == 'application/json':
                y = jsonXY['valueY']
                return y

        x = getX(getJsVars())
        y = getY(getJsVars())

        a = request.form.get('a')
        b = request.form.get('b')

        # * Code for form validation *

        # First, this prints the correct values once,
        # but prints again after "submit" with x and y having None value:
        print("The values are: " x, " ", y)

        return render_template("index.html")

JS代码:

if (window.location.pathname === "/foo") {
    let xVal, yVal;

    function sendXandY(x, y) {
        const valX = x;
        const valY = y

        $.ajax({
            url: '/foo',
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify({
                valueX: valX,
                valueY: valY,
            }),
            success: function() {
                console.log("OK - 200");
            },
            error: function(error) {
                console.log(error);
            },
        });
    }

    function processXandY() {
        // x and y get their values here
        xVal = 10;
        yVal = 20;

        // Function call to send x and y to url via POST:
        sendXandY(xVal, yVal);
    }

    document.getElementById("get-xy").addEventListener("click", function ()         
    {
        processXandY();
    });

我在烧瓶终端中得到的输出是这样的:

INFO: 127.0.0.1 - - [20/Oct/2023 12:30:02] "GET /static/script.js HTTP/1.1" 200 -
The values are: 10 20

INFO: 127.0.0.1 - - [20/Oct/2023 12:30:04] "POST /foo HTTP/1.1" 200 -
The values are: None None

如何防止局部变量和 flask 函数设置为 None?我是这方面的新手,以前从未尝试过在 JavaScript 和 python/flask 之间建立通信。我试图阅读文档,但无法弄清楚锄头来完成这项工作。任何指导都是值得赞赏的。谢谢。xy

javascript python jquery ajax 烧瓶

评论

0赞 EAW 10/21/2023
flask 路由函数与普通的 python 函数没有什么不同,每个调用都独立于其他每个调用,没有共享的局部变量。既然您似乎想一起处理 x、y 和表单,为什么不将它们添加到表单本身并立即提交所有内容呢?
0赞 Rishikesh Negi 10/21/2023
@EAW 在我编写的实际程序中,x 和 y 实际上是用户在传单 js 地图上点击的位置的经纬度。因此,只要用户点击地图,纬度和经度都会记录到 JS 变量中。我设法通过使用 2 个全局变量来解决这个问题,但我仍然想知道是否有办法在不使用全局变量的情况下做到这一点。
0赞 EAW 10/21/2023
向窗体添加两个隐藏字段,一个用于 x,一个用于 y,然后从函数 processXsndY 填充这些字段,而不是执行 ajax 调用。
0赞 Rishikesh Negi 10/21/2023
@EAW我有这个想法,但我意识到人们可以使用开发工具在浏览器中使用 HTML。不能将其公开给用户。
0赞 EAW 10/21/2023
您的 ajax 调用与表单数据一样容易受到操纵。任何客户端数据都不能被信任,必须在服务器收到时进行验证。

答: 暂无答案