You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JavaScript获取Flask数据库数据并实现前端下拉框用户展示

Flask传递数据库用户数据到JavaScript的实现方案

下面是3种常用的实现方式,可根据业务场景选择:

方法1:模板内直接注入JSON(最常用,适合中小数据量)

这是最简单的方案,页面渲染时直接把序列化后的用户数据注入到JS变量中,不需要额外发起请求。

后端代码示例

from flask import Flask, render_template
import json
from your_app.models import User # 替换为自己项目的User模型

app = Flask(__name__)

@app.route('/')
def index():
    # 从数据库查询所需的用户字段,避免返回冗余数据
    users = User.query.with_entities(User.id, User.username).all()
    # 转换为字典列表后序列化为JSON字符串
    user_data = [{"id": u.id, "name": u.username} for u in users]
    user_json = json.dumps(user_data)
    return render_template('index.html', user_json=user_json)

前端模板代码示例

<!-- 下拉框DOM -->
<select id="user-select"></select>

<script>
// 直接接收后端注入的JSON,加safe过滤器避免Jinja2转义特殊字符
const userList = {{ user_json|safe }};

// 渲染下拉框逻辑
const selectEl = document.getElementById('user-select');
userList.forEach(user => {
  const option = document.createElement('option');
  option.value = user.id;
  option.innerText = user.name;
  selectEl.appendChild(option);
});
</script>

方法2:通过HTML自定义属性传递(适合禁止内联JS的场景)

如果项目安全规则不允许写内联JS,可以把数据存在DOM的自定义属性里,JS读取后再解析。

前端模板代码示例

<select id="user-select" data-users="{{ user_json|safe }}"></select>

<!-- 外部引入的JS文件也可以读取该属性 -->
<script src="/static/js/your_script.js"></script>

JS代码示例

const selectEl = document.getElementById('user-select');
const userList = JSON.parse(selectEl.dataset.users);
// 后续渲染逻辑和方法1一致

方法3:异步接口获取(适合大数据量/需要动态刷新的场景)

如果用户数据量很大、或者下拉框需要根据其他条件动态刷新,就用独立的接口返回用户数据。

后端接口代码示例

@app.route('/api/get_users')
def get_users():
    users = User.query.with_entities(User.id, User.username).all()
    user_data = [{"id": u.id, "name": u.username} for u in users]
    # Flask 2.0+ 支持直接返回字典自动转为JSON响应
    return {"code": 0, "data": user_data}

JS代码示例

fetch('/api/get_users')
  .then(response => response.json())
  .then(res => {
    const userList = res.data;
    const selectEl = document.getElementById('user-select');
    // 渲染下拉框逻辑和方法1一致
    userList.forEach(user => {
      const option = document.createElement('option');
      option.value = user.id;
      option.innerText = user.name;
      selectEl.appendChild(option);
    });
  });

注意事项

  • 前两种方案传递数据时,不要手动拼接JSON字符串,用Python内置的json.dumps序列化可以自动处理特殊字符转义,配合Jinja2的safe过滤器即可避免XSS风险。
  • 如果用户数据包含敏感信息,异步接口必须加权限校验,避免未授权访问泄露数据。
  • 数据量超过1000条时不建议用前两种注入方案,会拖慢页面首次加载速度,优先用异步接口加分页/懒加载优化。

内容的提问来源于stack exchange,提问作者FlafyKing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:09:01