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

如何通过HTML的onBlur事件调用Flask后端函数实现用户名校验

嘿,作为Flask新手能想到做实时用户名校验,这个思路很棒!要实现你说的功能,咱们得把前端交互和后端数据库查询结合起来,我给你拆解成几个步骤:

第一步:后端添加用户名校验API

首先得在你的Flask应用里新增一个接口,专门用来接收前端的用户名,去MongoDB里查询是否已存在。假设你已经配置好了MongoDB连接,代码大概是这样:

from flask import Flask, request, jsonify
from pymongo import MongoClient

# 替换成你自己的MongoDB连接信息
client = MongoClient('mongodb://localhost:27017/')
db = client['your_db_name']  # 你的数据库名称
users_col = db['users']      # 存储用户数据的集合名称

@app.route('/check-username', methods=['POST'])
def check_username():
    # 获取前端传过来的用户名
    username = request.json.get('username', '').strip()
    if not username:
        return jsonify({'available': False})
    
    # 查询数据库中是否存在该用户名
    existing_user = users_col.find_one({'username': username})
    if existing_user:
        # 用户名已被占用
        return jsonify({'available': False})
    else:
        # 用户名可用
        return jsonify({'available': True})

第二步:修改前端交互逻辑

接下来要调整你的模板代码,更新NameCheck()函数,让它通过异步请求调用上面的后端接口,然后根据返回结果切换Font Awesome图标的样式和显示状态:

{% extends 'layout.html' %} {% block body %} 
<div class="container">
  <form method="post" action="{{ url_for('signup') }}">
    <label for="user">Username </label>
    <input type="text" id="user" name="user" onblur='NameCheck()'>
    <!-- 先默认隐藏图标,后续根据校验结果显示 -->
    <i id='acceptIC' class="fas" style="display: none; margin-left: 8px;"></i>
    
    <label for="pas">Password </label>
    <input type="password" id="pas" name="pas">
    
    <label for="mail">Email ID </label>
    <input type="email" id="mail" name="mail">
    
    <button type="submit">Signup</button>
  </form>
</div>

<script>
async function NameCheck() {
  const usernameInput = document.getElementById('user');
  const username = usernameInput.value.trim();
  const statusIcon = document.getElementById('acceptIC');

  // 如果用户没输入内容,直接隐藏图标
  if (!username) {
    statusIcon.style.display = 'none';
    return;
  }

  try {
    // 发送请求到后端校验接口
    const response = await fetch('/check-username', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ username: username })
    });

    const result = await response.json();

    if (result.available) {
      // 用户名可用:显示绿色对勾
      statusIcon.className = 'fas fa-check-circle';
      statusIcon.style.color = '#2ecc71';
      statusIcon.style.display = 'inline-block';
    } else {
      // 用户名已存在:显示红色叉号
      statusIcon.className = 'fas fa-times-circle';
      statusIcon.style.color = '#e74c3c';
      statusIcon.style.display = 'inline-block';
    }
  } catch (err) {
    console.error('校验用户名时出错:', err);
    // 请求失败时显示警告图标
    statusIcon.className = 'fas fa-exclamation-circle';
    statusIcon.style.color = '#f39c12';
    statusIcon.style.display = 'inline-block';
  }
}
</script>
{% endblock %}

第三步:一些优化建议(可选)

  • 可以把样式写到CSS文件里,避免内联样式:
    #acceptIC {
      margin-left: 8px;
      vertical-align: middle;
      font-size: 1.2em;
    }
    
  • 除了onblur,还可以加oninput事件,让用户输入过程中就实时校验,提升体验
  • 生产环境记得开启CSRF保护,如果你用Flask-WTF的话,要给fetch请求带上CSRF令牌
  • 可以给输入框加一点反馈,比如用户名已存在时给输入框加红色边框

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:02:52