2017-05-06 2 views
-1

J'ai eu quelques problèmes avec /quote dans PSET 7 de CS50. Chaque fois que je vais dans le site de la finance CS50, il retourne:CS50 PSET7 Quote: 'NoneType' Erreur

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

Je ne sais pas ce que cela signifie, ni comment y remédier. Il semble aller automatiquement à «None» dans la fonction de recherche, mais je ne sais pas pourquoi. Si quelqu'un pouvait m'aider, je l'apprécierais vraiment!

Ceci est ma part de citation de 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") 

Ceci est mon helpers.py, qui est pas censé être changé:

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() 
    } 

Enfin, voici ma citation. 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

À l'avenir, veuillez inclure la trace complète de la pile, y compris les numéros de ligne et les noms de fichiers, et pas seulement le message d'erreur. –

Répondre

0

J'ai réussi à trouver la réponse, je censé mettre:

symbol = request.form.get("symbol") au lieu de: symbol = request.args.get("symbol").

1

Cette erreur se produirait quand il n'y a aucun paramètre "symbol" dans la demande.

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

Parce que ce n'est pas présent, .get(...) retournera None, et quand vous appelez lookup(None) il va essayer de lancer la ligne suivante, avec symbol comme None:

if symbol.startswith("^"): 

Ce qui signifie que vous essayez de faites None.startswith(...), en expliquant l'erreur que vous voyez.

Vous pouvez vérifier le cas où symbol est manquant/None et afficher un message d'erreur.

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

Ou vous pouvez simplement l'ignorer: s'il n'y a pas de symbole, la demande est probablement invalide, et vous pouvez accepter qu'il provoque une erreur.

+0

Merci beaucoup. Je me demandais comment je serais capable de vérifier si le symbole manquait ou non? – Emikko29

+0

@ Emikko29 Je suis content que ça a aidé! Si cela a résolu votre problème, vous avez * l'option * de le sélectionner comme réponse "acceptée"/correcte en cliquant sur la coche ✔️ sur la gauche. –

+0

@ Emikko29 Désolé, j'ai mal compris la question dans votre commentaire. Mon erreur. Si vous ne l'avez pas déjà trouvé: vous pouvez utiliser le symbole 'if 'dans request.args pour vérifier s'il existe, même si c'est' None'. –