Flask天气应用删除功能开发求助:无法实现城市删除操作
Flask天气应用删除功能修复方案
我仔细看了你的代码,发现几个关键问题导致删除功能无法正常工作,咱们一步步来解决:
核心问题分析
- 重复定义视图函数:你写了两个同名的
index()函数,Flask只会加载最后一个定义的视图,这直接导致原来的添加城市功能被覆盖,同时删除逻辑本身也有错误。 - 删除逻辑错误:你创建了一个新的
City对象来执行删除操作,但这个对象并没有关联到数据库中的现有记录,所以db.session.delete()根本找不到要删除的数据。 - 无效的列表操作:你尝试用
weather_data.delete(weather)删除天气数据,但列表的delete()方法是按索引删除元素,而且这一步完全多余——只要数据库中的城市被删除,后续生成天气数据时自然不会包含它。
修复步骤及代码修改
1. 合并视图函数,统一处理添加/删除操作
把两个index()函数合并成一个,通过表单提交的操作类型区分添加和删除行为。我们可以给按钮添加name和value属性,让后端判断用户的操作:
修改后的app.py核心代码
import requests from flask import Flask, render_template, request from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['DEBUG'] = True app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///weather.db' db = SQLAlchemy(app) class City(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), nullable=False) @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': # 通过按钮的value判断操作类型 action = request.form.get('action') if action == 'add': new_city = request.form.get('city') if new_city: # 先检查城市是否已存在,避免重复添加 existing_city = City.query.filter_by(name=new_city).first() if not existing_city: new_city_obj = City(name=new_city) db.session.add(new_city_obj) db.session.commit() elif action == 'delete': dcity_name = request.form.get('dcity') if dcity_name: # 查询数据库中要删除的城市记录 city_to_delete = City.query.filter_by(name=dcity_name).first() if city_to_delete: db.session.delete(city_to_delete) db.session.commit() # 从数据库获取所有城市,生成天气数据 cities = City.query.all() url = 'http://api.openweathermap.org/data/2.5/weather?q={}&units=imperial&appid=271d1234d3f497eed5b1d80a07b3fcd1' weather_data = [] for city in cities: try: r = requests.get(url.format(city.name)).json() # 确保API返回成功再处理数据 if r.get('cod') == 200: weather = { 'city' : city.name, 'temperature' : r['main']['temp'], 'description' : r['weather'][0]['description'], 'icon' : r['weather'][0]['icon'], } weather_data.append(weather) except Exception as e: # 处理API请求失败的情况(比如网络问题) print(f"获取{city.name}天气失败: {e}") return render_template('weather.html', weather_data=weather_data) if __name__ == '__main__': with app.app_context(): db.create_all() # 确保数据库表被创建 app.debug = True app.secret_key = '\xb0\xdb\x92P\x89\x12\xb0j\xfc9%)N\xd5\x8f\xfc\xa3\xcf\xecmn\xb9\xc0\xca' app.run()
2. 修改模板中的表单按钮,添加操作标识
给两个表单的按钮添加name="action"和对应的value,让后端能区分添加和删除操作:
修改后的weather.html表单部分
<!-- 添加城市表单 --> <form method="POST"> <div class="field has-addons"> <div class="control is-expanded"> <input class="input" name="city" type="text" placeholder="City Name"> </div> <div class="control"> <button class="button is-info" name="action" value="add"> Add City </button> </div> </div> </form> <!-- 删除城市表单 --> <form method="POST"> <div class="field has-addons"> <div class="control is-expanded"> <input class="input" name="dcity" type="text" placeholder="City Name"> </div> <div class="control"> <button class="button is-info" name="action" value="delete"> Remove City </button> </div> </div> </form>
额外优化建议
- 添加flash消息:可以在添加/删除成功或失败时给用户提示(比如城市不存在时),提升用户体验。
- 处理API错误:如果输入的城市名称无效,API会返回错误,你可以在代码中检测并从数据库中移除无效城市,或者提示用户。
- 城市名称去重:添加城市时统一转换为小写(或大写),避免重复添加同名不同大小写的城市。
内容的提问来源于stack exchange,提问作者Keith Lashley
相关产品推荐
相关产品推荐

