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
相关产品推荐
相关产品推荐

