Flask接收HTML表单输入调用天气API报错问题求助
Flask天气查询代码问题分析与修复
核心问题梳理
- response变量未定义:response仅在POST请求分支内初始化,GET请求时未执行该分支,后续判断
response.status_code会触发NameError。 - 表单取值语法错误:
request.form.get["city"]写法错误,get是字典方法,需用括号调用:request.form.get("city")。 - 缺失有效响应返回:else分支无实际返回内容,Flask视图函数必须返回合法响应,否则触发500内部服务器错误。
- 模板数据未传递:成功获取数据后,未将天气、温度变量传给模板,页面无法展示结果。
修复后的完整代码
from flask import Flask, request, render_template, redirect import requests app = Flask(__name__) @app.route('/weather', methods=["GET","POST"]) def weather(): API_KEY = "SOME KEY I GOT" BASE_URL = "https://api.openweathermap.org/data/2.5/weather" # 初始化response变量,避免GET请求时未定义 response = None if request.method == "POST": city = request.form.get("city") # 修正get方法调用语法 if city: # 增加城市名非空判断 request_url = f"{BASE_URL}?appid={API_KEY}&q={city}" response = requests.get(request_url) # 先判断response是否存在,再检查状态码 if response and response.status_code == 200: data = response.json() weather_desc = data['weather'][0]['description'] temperature = round(data["main"]["temp"] - 273.15, 2) # 将数据传递给模板 return render_template("weather.html", weather=weather_desc, temp=temperature) else: # 重定向到首页或返回错误提示 return redirect("/index")
额外优化建议
- 增加城市名非空校验,避免空字符串调用API导致无效请求。
- 处理API返回的异常情况(如城市不存在时的JSON解析错误),可以用try-except包裹json解析逻辑。
- 将API_KEY放到环境变量中,避免硬编码敏感信息。
内容的提问来源于stack exchange,提问作者OldLadyCoding
相关产品推荐
相关产品推荐

