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

CS50 Finance开发Index功能时出现500内部服务器错误求助

CS50 Finance Index功能500错误排查与修复

核心问题分析

从代码和错误场景来看,引发500内部服务器错误的原因主要集中在缩进错误、模板语法错误、未处理API返回异常三个方面,具体如下:

1. app.py缩进错误(致命)

index函数内的代码缩进混乱,stocks查询语句后的代码(cash查询、变量初始化、循环逻辑)全部脱离了函数作用域,变成全局代码。Flask启动时会直接执行这些全局代码,此时session["user_id"]尚未初始化,直接抛出KeyError,触发500错误。

2. index.html模板语法错误

模板中尝试用{{ stock * stock.total_shares }}计算总价值,但stock是字典对象,无法与数字直接相乘,模板渲染时会抛出类型错误,导致500错误。

3. 未处理lookup返回None的情况

当API请求失败或股票符号无效时,lookup函数会返回None,此时直接访问quote["name"]会抛出KeyError,引发500错误。


修复方案

1. 修正app.py的缩进问题

将index函数内的所有代码正确缩进,确保在函数作用域内执行:

@app.route("/")
@login_required
def index():
    """Show portfolio of stocks"""
    # Get user's stocks and shares
    stocks = db.execute("SELECT symbol, SUM(shares) as total_shares FROM transactions WHERE user_id = :user_id GROUP BY symbol HAVING total_shares > 0",
                   user_id=session["user_id"])

    # Get user's cash balance
    cash = db.execute("SELECT cash FROM users WHERE id = :user_id", user_id=session["user_id"])[0]["cash"]

    # Initialize variables for total values
    total_value = cash
    grand_total = cash

    # Iterate over stocks and add price and total value
    for stock in stocks:
        quote = lookup(stock["symbol"])
        # 处理API返回None的情况
        if not quote:
            return apology(f"无法获取股票 {stock['symbol']} 的报价", 400)
        stock["name"] = quote["name"]
        stock["price"] = quote["price"]
        stock["value"] = stock["price"] * stock["total_shares"]
        total_value += stock["value"]
        grand_total += stock["value"]

    return render_template("index.html", stocks=stocks, cash=cash, total_value=total_value, grand_total=grand_total)

注意:SQL语句中SUM (shares)的空格需删除,改为SUM(shares),避免语法错误。

2. 修复index.html模板错误

将错误的总价值计算代码替换为提前计算好的stock.value,同时使用usd过滤器格式化数值:

{% for stock in stocks %}
    <tr>
        <td>{{ stock.symbol }}</td>
        <td>{{ stock.name }}</td>
        <td>{{ stock.total_shares }}</td>
        <td>{{ stock.price | usd }}</td>
        <td>{{ stock.value | usd }}</td>
    </tr>
{% endfor %}
<tr>
    <td colspan="4" align="right">Cash</td>
    <td>{{ cash | usd }}</td>
</tr>
<tr>
    <td colspan="4" align="right">Total Value</td>
    <td>{{ total_value | usd }}</td>
</tr>

若模板未识别usd过滤器,需在app.py中添加过滤器注册:app.jinja_env.filters["usd"] = usd

3. 处理API异常

在循环中增加对lookup返回值的判断,避免因API请求失败导致程序崩溃,如上述app.py代码中添加的if not quote分支。


内容的提问来源于stack exchange,提问作者Kaley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:22:14