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

Flask天气应用删除功能开发求助:无法实现城市删除操作

Flask天气应用删除功能修复方案

我仔细看了你的代码,发现几个关键问题导致删除功能无法正常工作,咱们一步步来解决:

核心问题分析

  1. 重复定义视图函数:你写了两个同名的index()函数,Flask只会加载最后一个定义的视图,这直接导致原来的添加城市功能被覆盖,同时删除逻辑本身也有错误。
  2. 删除逻辑错误:你创建了一个新的City对象来执行删除操作,但这个对象并没有关联到数据库中的现有记录,所以db.session.delete()根本找不到要删除的数据。
  3. 无效的列表操作:你尝试用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:32:38