2017-05-06 30 views
-1

我一直有在CS50的PSET 7一些麻烦/quote。每次去到CS50理财网站,它返回:CS50 PSET7引用: 'NoneType' 错误

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

我不知道这意味着什么,也不知道如何解决它。它似乎在查找功能中自动进入'无',但我不知道为什么。如果有人能帮助我,我会非常感激!

这是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 
    # http://stackoverflow.com/a/21351911 
    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() 
    } 

最后,这是我的报价。 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 %} 
+0

在未来,请包括完整的堆栈跟踪,其中包括行号和文件名,不只是错误信息。 –

回答

0

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

symbol = request.form.get("symbol")代替: symbol = request.args.get("symbol")

1

如果请求中没有"symbol"参数,则会发生此错误。

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

因为它不存在,.get(...)将返回None,当你调用lookup(None)它会尝试运行以下命令行,以symbolNone

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") 

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

+0

非常感谢。我想知道,我该如何检查符号是否丢失/无? – Emikko29

+0

@ Emikko29我很高兴它帮助!如果这个解决您的问题,您可以选择它作为“接受” /正确点击左边的✔️勾选答案的选项* *。 –

+0

@ Emikko29对不起,我误解了您的评论的问题。我的错。如果你还没有找到它:你可以使用'如果“符号”在request.args'检查,如果它的存在,即使是'None'。 –