CS50 PSET7 引用:'NoneType' 错误

CS50 PSET7 Quote: 'NoneType' Error

我在使用 CS50 的 PSET 7 中的 /quote 时遇到了一些问题。每次我进入 CS50 财经网站,它 returns:

AttributeError: 'NoneType' object has no attribute 'startswith'

我不确定这是什么意思,也不知道如何解决。它似乎在查找功能中自动转到 'None' ,但我不确定为什么。如果有人能帮助我,我将不胜感激!

这是我对 application.py 的引用部分:

@app.route("/quote", methods=["GET", "POST"])
@login_required
def quote():
    """Get stock quote."""
    if request.method == "POST":
        symbol = request.args.get("symbol")
        quote = lookup(symbol)
        return render_template("quoted.html", name=quote)
    else: 
        return render_template("quote.html") 

这是我的 helpers.py,不应更改:

def lookup(symbol):
    """Look up quote for symbol."""

    # reject symbol if it starts with caret
    if symbol.startswith("^"):
        return None

    # reject symbol if it contains comma
    if "," in symbol:
        return None

    # query Yahoo for quote
    # 
    try:
        url = "http://download.finance.yahoo.com/d/quotes.csv?f=snl1&s={}".format(symbol)
        webpage = urllib.request.urlopen(url)
        datareader = csv.reader(webpage.read().decode("utf-8").splitlines())
        row = next(datareader)
    except:
        return None

    # ensure stock exists
    try:
        price = float(row[2])
    except:
        return None

    # return stock's name (as a str), price (as a float), and (uppercased) symbol (as a str)
    return {
        "name": row[1],
        "price": price,
        "symbol": row[0].upper()
    }

最后,这是我的 quote.html:

{% extends "layout.html" %}

{% block title %}
    Quote
{% endblock %}

{% block main %}
    <form action="{{ url_for('quote') }}" method="post">
        <fieldset>
            <div class="form-group">
                <input autocomplete="off" autofocus class="form-control" name="symbol" placeholder="symbol" type="symbol"text"/>
            </div>
            <div class="form-group">
                <button class="btn btn-default" type="submit">Search for Quote</button>
            </div>
        </fieldset>
    </form>
{% endblock %}

如果请求中没有 "symbol" 参数,就会出现该错误。

    symbol = request.args.get("symbol")
    quote = lookup(symbol)

因为它不存在,.get(...) 将 return None,当您调用 lookup(None) 时,它会尝试 运行 以下行,其中symbol 作为 None:

if symbol.startswith("^"):

这意味着您正在尝试 None.startswith(...),解释您看到的错误。

您可以检查缺少 symbol 的情况/None 并显示错误消息。

    symbol = request.args.get("symbol")
    if symbol:
        quote = lookup(symbol)
        return render_template("quoted.html", name=quote)
    else:
        return render_template("missing_symbol.html")

或者您可以忽略它:如果没有符号,则请求可能无效,您可以接受它会导致错误。

我设法找到了答案,我应该把:

symbol = request.form.get("symbol") 而不是: symbol = request.args.get("symbol").