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")
.
我在使用 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")
.