Python中如何在IF语句外部访问其内部定义的变量
问题根因
- 你的POST请求分支中,给
searchData赋值后立刻调用了return jsonify(searchData),请求直接返回,不会执行后续的数据库查询代码,所以你会感觉POST分支没有修改searchData的值。 - GET请求不会进入
if request.method == "POST"的分支,所以如果不在分支外提前声明searchData,GET请求走到SQL执行步骤时就会抛出变量未定义的错误;如果提前声明了初始值,GET请求使用的就是这个初始值,和POST提交的内容没有关联。
解决思路
首先明确接口的业务逻辑,以下是两种常见场景的修复方案:
场景1:仅接收POST请求提交搜索关键词,返回匹配的公司列表
直接将数据库查询逻辑移入POST分支,删除多余的返回语句,示例代码如下:
@app.route('/ML', methods=['POST']) def index(): if request.method == "POST": request_data = json.loads(request.data) searchData = request_data['content'] # 把数据库查询逻辑移到POST分支内 mycursor = mydb.cursor(dictionary=True) query = "SELECT * FROM COMPANY WHERE COMPANY_NAME LIKE %s LIMIT 20;" mycursor.execute(query,("%" + searchData + "%",)) myresult = mycursor.fetchall() company = [] for result in myresult: content ={'COMPANY_NAME':result['COMPANY_NAME'],} company.append(content) return jsonify(company)
场景2:同时支持GET、POST两种请求,POST提交关键词返回结果,GET请求支持传参或者返回默认结果
可以在分支外声明searchData的默认值,同时根据请求方法给变量赋值,示例代码如下:
@app.route('/ML', methods=['GET', 'POST']) def index(): searchData = "" # 给默认值,比如空字符串匹配所有或者自定义默认搜索词 if request.method == "POST": request_data = json.loads(request.data) searchData = request_data['content'] elif request.method == "GET": # 可选:支持GET请求从查询参数取搜索词,比如 /ML?keyword=xxx searchData = request.args.get("keyword", "") mycursor = mydb.cursor(dictionary=True) query = "SELECT * FROM COMPANY WHERE COMPANY_NAME LIKE %s LIMIT 20;" mycursor.execute(query,("%" + searchData + "%",)) myresult = mycursor.fetchall() company = [] for result in myresult: content ={'COMPANY_NAME':result['COMPANY_NAME'],} company.append(content) return jsonify(company)
额外优化建议
- 可以对请求入参的
searchData做非空、长度校验,避免无效查询。 - 数据库操作完成后记得关闭游标和连接,避免连接泄漏。
内容的提问来源于stack exchange,提问作者mirkovski
相关产品推荐
相关产品推荐

