I´m new to programming, doing CS50 and currently struggling to complete the Pset9 – Finance, version from 2021. I´ve read as many threads I could find about the same issue, but none of the answers helped me to solve the problem yet.
Application.py is doing what the problem briefing required, and I passed all tests except for this one, check50 is expecting a status code 200 but I send a 400.
Something to keep in mind:
- Registration works as expected. I am able to register new users, and when the same username tries to register I show a 400 error.
- Index function is completed, and fully functional showing all required data.
- No script in Register.html to check username when pressing the submit button. I have been unable to write the right script. Not sure if this is something CS50 is expecting after all, but happy to hear anyone who has passed this test.
I would really appreciate it if someone can take a look at the code below, and let me know if I am doing something wrong or just point me in the right direction. Thanks in advance!
Here is my code for register in application.py :
@app.route("/register", methods=["GET", "POST"])
def register():
# Forget any user_id
session.clear()
# Registering a user when POST method
if request.method == "POST":
# Capturing name and password
name = request.form.get("username")
key1 = request.form.get("password")
key2 = request.form.get("confirmation")
# If fields are empty render apology
if not name:
return apology("Sorry, name is empty", 400)
elif not key1 or not key2:
return apology("Sorry, password is empty", 400)
# If keys are different render an apology
elif key1 != key2:
return apology("Sorry, passwords do not match", 400)
# Once password is valid then hash it before storing it.
key = generate_password_hash(key1, method='pbkdf2:sha256', salt_length=8)
# Checking if username exists in the database
raws = db.execute("SELECT * FROM users WHERE username = :name", name=name)
if len(raws) == 1:
return apology("Sorry, username already exists", 400)
# Include register into our database
db.execute("INSERT INTO users (username, hash) VALUES(?, ?)", name, key)
# Query again the user row, so we can pass into a session
rows = db.execute("SELECT * FROM users WHERE username = :name", name=name)
# Login the user just registered
session["user_id"] = rows[0]["id"]
# return render_template("register.html")
return redirect("/")
else:
return render_template("register.html")
Here is index in application.py :
@app.route("/")
@login_required
def index():
"""Show portfolio of stocks"""
# Query stock information from user session
stocks = db.execute("SELECT stock_symbol, stock_name, shares, value, price FROM (SELECT stock_symbol, stock_name, SUM(shares) as shares, SUM(value) as value, price FROM stocks WHERE user_id=:session GROUP by stock_symbol) WHERE shares>0", session=session["user_id"])
# Loop to sum up all stock value up
stockValue = 0
for stock in stocks:
stockValue += stock["value"]
# Query cash information from user session and send this to the html
row_cash = db.execute("SELECT cash FROM users WHERE id=:session", session=session["user_id"])
cash = row_cash[0]["cash"]
# Grand total variable adding up stock value and cash
grand_total = stockValue + cash
return render_template("index.html", stocks=stocks, cash=usd(cash), grand_total=usd(grand_total))
Here is Register.html:
{% extends “layout.html” %}
{% block title %}
Register
{% endblock %}
{% block main %}
<form action="/register" method="post">
<div class="form-group">
<input autocomplete="off" autofocus class="form-control" name="username" placeholder="Username" type="text">
</div>
<div class="form-group">
<input class="form-control" name="password" placeholder="Password" type="password">
</div>
<div class="form-group">
<input class="form-control" name="confirmation" placeholder="Repeat Password" type="password">
</div>
<button class="btn btn-primary" type="submit">Register</button>
</form>
{% endblock %}
And here is index.html:
{% extends "layout.html" %}
{% block title %}
Stocks
{% endblock %}
{% block main %}
<table class="table table-striped">
<thead>
<tr>
<th>Symbol</th>
<th>Name</th>
<th>Shares</th>
<th>Price</th>
<th>Grand Total</th>
</tr>
</thead>
<tbody>
<!-- Loop through the database entries to display them in this table -->
{% for stock in stocks %}
<tr>
<td>{{ stock.stock_symbol }}</td>
<td>{{ stock.stock_name }}</td>
<td>{{ stock.shares }}</td>
<td>{{ stock.price | usd }}</td>
<td>{{ (stock.value) | usd }}</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
<tr>
<td>Overall stock value</td>
<td colspan=3></td>
<td>{{ "${:,.2f}".format(stocks|sum('value')) }}</td>
</tr>
<tr>
<td>CASH</td>
<td colspan=3></td>
<td>{{ cash }}</td>
</tr>
<tr>
<td colspan=4></td>
<td>{{ grand_total }}</td>
</tr>
</tfoot>
</table>
{% endblock %}
Advertisement
Answer
The issue was finally fixed when I deleted all my data in users.db thencheck50 passed it correctly. It seems that data was causing the whole problem, and once deleted everything got fixed.