【问题标题】:Access a single SQLAlchemy object through JS通过 JS 访问单个 SQLAlchemy 对象
【发布时间】:2026-01-23 05:10:01
【问题描述】:

我正在尝试使用 on change 根据 select2 字段中的选择来更新我的大部分站点数据。我遵循了使用fetch 的教程来创建一个包含从数据库中提取的信息的 JSON 文件。虽然,这种情况略有不同,因为我试图访问一个对象以在我的 JS 中使用以更新某些站点 HTML。

我曾尝试使用fetch 返回该对象,但我发现它返回一个包含有关 URL 的随机数据的数组。

views.py

​​>
@app.route('/selected_room/<int:room_id>')
def selected_room(room_id):
    room = Room.query.filter_by(id=room_id).first_or_404()

    return room

返回:

body: (...)
bodyUsed: false
headers: Headers {}
ok: true
redirected: false
status: 200
statusText: "OK"
type: "basic"
url: "http://127.0.0.1:5000/room/2"

我已经在上面发布了一些代码,但这里是我目前设置的所有内容。

views.py

​​>
@app.route('/selected_room/<int:room_id>')
def selected_room(room_id):
    room = Room.query.filter_by(id=room_id).first_or_404()

    return room

js

$(document).ready(function(){
    $('#rooms').on('change', function() {
        var room_id = $(this).val();

        fetch('/room/' + room_id).then(function(data) {
            // this console.log is me testing to see what data returns
            console.log(room_id, data, data.room_id, data.room, data.rooms);
        });
    });
});

实际上,我正在寻找 {{ object.id(etc) }} 的 JS 替换。要么我完全离开并且无法做到这一点,要么我只是走错了路。感谢您的帮助!

【问题讨论】:

    标签: javascript database postgresql flask


    【解决方案1】:

    让我们系统地思考一下。

    fetch 记录在MDN。您似乎使用正确的参数调用它:resource,它可以是一个 URL,并且没有 init 参数(这是可选的)。

    它说fetch 返回一个promise,并且该promise 解析为Response 对象。如果您不熟悉 Promise,可以从那里点击链接到 Promise。如果你是,你就会知道data 参数是Response 对象。

    如果您点击链接查看Response 对象是什么,您会看到它包含诸如headersokredirected 等字段。这似乎与您的匹配写在您的问题中,标题为“返回:”。所以我假设您列出的返回值是data 对象,如console.log 所示。

    所以问题是:给定一个Response(变量data),你如何提取响应的正文?在Response 的文档中有几种访问响应正文的方法。您可以使用data.bodydata.arrayBuffer()data.blob()data.formData()data.json()data.text(),具体取决于它的响应类型。我对Python或任何flask都不太了解,我不知道Room在服务器端是什么,所以我不知道响应是什么样的。

    【讨论】:

    • 所以我试了一下,用了几个只是为了测试一下。最值得注意的是,我不断收到rooms: [object Object],[object Object],[object Object],[object Object] 作为响应,而不是我需要的数组。如果我让它正确地传递给我的 JS,我可能会过滤数组,但目前情况并非如此。也感谢您的帮助!
    • 代替我上次的回复,我意识到那些objects 可以进一步定义。我用console.log('rooms [0].room_number: ' + data.rooms[0].room_number); 再次测试,这返回了正确的数字。这意味着剩下的唯一事情就是弄清楚所选房间的位置。有什么想法吗?
    • 这很奇怪。 Python 代码似乎应该只返回一个房间,但 javascript 代码说它收到了其中的 4 个。除非...我注意到 Python 代码中的路由是 '/selected_room/&lt;int:room_id&gt;',但 javascript 调用的是 '/room/' + room_id。如果是这种情况,那么它甚至根本没有调用那个 API,它正在调用其他一些 API。如果您更改客户端代码以匹配 API,会发生什么情况?
    • 我继续并修复了该路由以匹配您所说的 API,并且成功。我打电话给错误的路线,它确实存在,但它用于其他用途。感谢@David Knipe 的帮助