MySQL中sign_up与applications表关联的求职申请鉴权异常问题
问题排查与修复方案
核心问题分析
当前逻辑的主要问题有两点:
- 用户ID获取方式错误:
get_user_id_from_request从请求头full_name拿用户名,但表单提交时,用户名通常放在表单数据(request.form)里而非请求头,导致注册用户也拿不到user_id,返回None。 - 校验逻辑顺序颠倒:先调用
insert_application再判断结果,而非先校验user_id是否有效,导致无效用户和有效用户的插入失败路径混在一起。
修复步骤
1. 修正用户ID获取逻辑
如果用户名是通过表单提交的(比如表单字段叫username),修改get_user_id_from_request从表单数据中获取:
def get_user_id_from_request(): """从请求的表单数据中获取用户ID""" # 按实际表单字段名调整,这里假设字段是username username = request.form.get("username") if username: with engine.connect() as conn: query = text("SELECT user_id FROM sign_up WHERE username = :username") result = conn.execute(query, {'username': username}).fetchone() if result: return result[0] # 找到则返回user_id return None
如果确实需要从请求头获取,需确保前端提交请求时正确设置full_name请求头字段。
2. 调整API端点的校验逻辑
先校验user_id是否存在,再执行插入操作,明确区分不同场景:
@app.route("/job/<id>/apply", methods=["post"]) def apply_job(id): data = request.form job = get_job_by_id(id) user_id = get_user_id_from_request() # 先校验用户是否已注册 if not user_id: return jsonify(None, "User not authenticated or signed up") # 用户已注册,执行申请插入操作 if insert_application(user_id, id, data): return render_template("app_submitted.html", application=data, job=job) else: return jsonify(user_id, "Failed to submit application")
3. 确保insert_application函数逻辑正确
该函数需正确处理user_id非空的情况,插入成功返回True,失败(如数据库错误)返回False,示例实现参考:
def insert_application(user_id, job_id, data): if not user_id or not job_id: return False try: with engine.connect() as conn: # 根据applications表实际字段调整插入语句 query = text(""" INSERT INTO applications (user_id, job_id, applicant_name, applicant_email) VALUES (:user_id, :job_id, :name, :email) """) conn.execute(query, { 'user_id': user_id, 'job_id': job_id, 'name': data.get('applicant_name'), 'email': data.get('applicant_email') # 其他表单字段按需添加 }) conn.commit() return True except Exception as e: print(f"Insert error: {e}") return False
额外调试建议
- 打印
user_id的值,确认注册用户的ID是否被正确获取。 - 检查前端表单提交的字段名,确保和后端获取的字段名完全一致。
内容的提问来源于stack exchange,提问作者Bereket Tena
相关产品推荐
相关产品推荐

