I am working on pset7 finance quote and my code isn't displaying anything in the form that returns the data about the stock to the user. I did some research in the forums and it sounds like there was a change to the API and some updates were needed to helpers.py. I made them but it didn't seem to change anything and I'm wondering if I've made the wrong combination of changes to helpers.py or if it is my code in application.py and the two html templates I created. I actually created a copy of helpers.py called helperstest.py, pulled out everything but the lookup function, added a get_string to input the stock symbol and tried to print what it was returning but it didn't print anything. I tried it with various combinations of the updates to helpers.py but nothing worked.
The things I changed in helpers.py are as follows:
changed:
url = f"https://www.alphavantage.co/query?apikey={os.getenv('API_KEY')}&datatype=csv&function=TIME_SERIES_INTRADAY&interval=1min&symbol={symbol}"
to:
url = f"https://www.alphavantage.co/query?apikey={os.getenv('API_KEY')}&datatype=csv&function=TIME_SERIES_DAILY&interval=1min&symbol={symbol}"
(i.e., replaced INTRADAY with DAILY)
changed the last part of the try function from:
return {
"price": price,
"symbol": symbol.upper()
}
to:
return {
"name": row[1],
"price": price,
"symbol": row[0].upper()
}
My code for helpers.py, quote function, quote.html and quotedisplay.html are as follows (will make the html pages prettier once it's working under the hood).
helpers.py:
import csv
import os
import urllib.request
from flask import redirect, render_template, request, session
from functools import wraps
def apology(message, code=400):
"""Render message as an apology to user."""
def escape(s):
"""
Escape special characters.
https://github.com/jacebrowning/memegen#special-characters
"""
for old, new in [("-", "--"), (" ", "-"), ("_", "__"), ("?", "~q"),
("%", "~p"), ("#", "~h"), ("/", "~s"), ("\"", "''")]:
s = s.replace(old, new)
return s
return render_template("apology.html", top=code, bottom=escape(message)), code
def login_required(f):
"""
Decorate routes to require login.
http://flask.pocoo.org/docs/0.12/patterns/viewdecorators/
"""
@wraps(f)
def decorated_function(*args, **kwargs):
if session.get("user_id") is None:
return redirect("/login")
return f(*args, **kwargs)
return decorated_function
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 Alpha Vantage for quote
# https://www.alphavantage.co/documentation/
try:
# GET CSV
url = f"https://www.alphavantage.co/query?apikey={os.getenv('API_KEY')}&datatype=csv&function=TIME_SERIES_DAILY&interval=1min&symbol={symbol}"
webpage = urllib.request.urlopen(url)
# Parse CSV
datareader = csv.reader(webpage.read().decode("utf-8").splitlines())
# Ignore first row
next(datareader)
# Parse second row
row = next(datareader)
# Ensure stock exists
try:
price = float(row[4])
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()
}
except:
return None
def usd(value):
"""Format value as USD."""
return f"${value:,.2f}"
quote function:
@app.route("/quote", methods=["GET", "POST"])
@login_required
def quote():
"""Get stock quote."""
# User reached route via POST (as by submitting a form via POST)
if request.method == "POST":
# Make sure fields aren't left blank
# Else apologize
if not request.form.get("symbol"):
# return apology (relevant error message, e.g., "Missing username!")
return apology("please enter a stock symbol (e.g., AMZN)", 403)
else:
quote = lookup("symbol")
return render_template("quotedisplay.html", displayquote=quote)
else:
return render_template("quote.html")
quote.html:
{% extends "layout.html" %}
{% block title %}
Quote
{% endblock %}
{% block main %}
<form action="/quote" method="post">
<div class="form-group">
<input autocomplete="off" autofocus class="form-control" name="symbol" placeholder="e.g., AMZN" type="text"/>
</div>
<button class="btn btn-primary" type="submit">Submit</button>
</form>
{% endblock %}
quote display.html
{% extends "layout.html" %}
{% block title %}
Quote Display
{% endblock %}
{% block main %}
<form action="/quotedisplay" method="get">
<div class="form-group">
<p>
QUOTE<br>
Name: {{ displayquote.name }}<br>
Price: {{ displayquote.price }}<br>
Symbol: {{ displayquote.symbol }}<br>
</p>
</div>
</form>
{% endblock %}