我刚刚完成 pset 9,一切正常(显然!),但是,每当我运行 check50 时,我都会回来:
:) app.py exists
:) application starts up
:) register page has all required elements
:) registering user succeeds and portfolio page is displayed
:) registration with an empty field fails
:) registration with password mismatch fails
:) registration rejects duplicate username
:) login page has all required elements
:( logging in as a registered user succeeds
expected status code 200, but got 403
:| quote page has all required elements
can't check until a frown turns upside down
:| quote handles invalid ticker symbol
can't check until a frown turns upside down
:| quote handles blank ticker symbol
can't check until a frown turns upside down
:| quote handles valid ticker symbol
can't check until a frown turns upside down
:| buy page has all required elements
can't check until a frown turns upside down
:| buy handles invalid ticker symbol
can't check until a frown turns upside down
:| buy handles fractional, negative, and non-numeric shares
can't check until a frown turns upside down
:| buy handles valid purchase
can't check until a frown turns upside down
:| sell page has all required elements
can't check until a frown turns upside down
:| sell handles invalid number of shares
can't check until a frown turns upside down
:| sell handles valid sale
can't check until a frown turns upside down
:| history page shows transactions
can't check until a frown turns upside down
我不知道这里是怎么回事(我的印象是登录功能是由工作人员负责的)。
将非常感谢您的建议!我已经提交了我的期末项目,这是唯一阻碍我完成课程的项目。任何指导将不胜感激。谢谢!
import os
from cs50 import SQL
from flask import Flask, flash, redirect, render_template, request, session
from flask_session import Session
from werkzeug.security import check_password_hash, generate_password_hash
from datetime import datetime
from helpers import apology, login_required, lookup, usd
# Configure application
app = Flask(__name__)
# Custom filter
app.jinja_env.filters["usd"] = usd
# Configure session to use filesystem (instead of signed cookies)
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)
# Configure CS50 Library to use SQLite database
db = SQL("sqlite:///finance.db")
@app.after_request
def after_request(response):
"""Ensure responses aren't cached"""
response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
response.headers["Expires"] = 0
response.headers["Pragma"] = "no-cache"
return response
@app.route("/")
@login_required
def index():
"""Show portfolio of stocks"""
cash_left = db.execute("SELECT cash FROM users WHERE id = ?", session["user_id"])
cashr = cash_left[0]["cash"]
total_stocks = 0
if not db.execute("SELECT symbol FROM purch WHERE user_id = ?", session["user_id"]):
return apology("no stocks in portfolio", 403)
all_stock_names = db.execute("SELECT symbol FROM purch WHERE user_id = ?", session["user_id"])
for i in all_stock_names:
db.execute("UPDATE purch SET price = ? WHERE user_id = ? AND symbol = ?", lookup(i["symbol"])['price'], session["user_id"], i["symbol"])
ptfl = db.execute("SELECT * FROM purch WHERE user_id = ?", session["user_id"])
for i in ptfl:
total_stocks = total_stocks + float(i["price"]) * float(i["quantity"])
total_amt = total_stocks + cashr
return render_template("index.html", portfolio = ptfl, cash_remainder = cashr, tval = total_stocks, tamt = total_amt)
@app.route("/buy", methods=["GET", "POST"])
@login_required
def buy():
"""Buy shares of stock"""
if request.method == "POST":
if not request.form.get("symbol"):
return apology("must provide symbol", 403)
elif not request.form.get("shares"):
return apology("must provide password", 403)
if lookup(request.form.get("symbol")) == None:
return apology("No Match Found", 403)
cash_list = db.execute("SELECT cash FROM users WHERE id = ?", session["user_id"])
cash = float(cash_list[0]["cash"])
price = float(lookup(request.form.get("symbol"))['price'])
quantity = float(request.form.get("shares"))
expenditure = quantity * price
if expenditure > cash:
return apology("Insufficient Funds", 403)
user_name = db.execute("SELECT username FROM users WHERE id = ?", session["user_id"])
user = user_name[0]["username"]
money_left = cash - expenditure
undertaking = "Bought"
update = False
p = db.execute("SELECT * FROM purch")
for i in p:
if i["symbol"] == request.form.get("symbol") and i["user_id"] == session["user_id"]:
of = db.execute("SELECT quantity FROM purch WHERE user_id = ? AND symbol = ?", session["user_id"], request.form.get("symbol"))
nf = of[0]["quantity"] + quantity
db.execute("UPDATE purch SET price = ?, quantity = ? WHERE user_id = ? AND symbol = ?", price, nf, session["user_id"], request.form.get("symbol"))
update = True
break
if update == False:
db.execute("INSERT INTO purch (user_id, username, symbol, price, quantity) VALUES (?, ?, ?, ?, ?)", session["user_id"], user, request.form.get("symbol"), price, quantity)
db.execute("UPDATE users SET cash = ? WHERE id = ?", money_left, session["user_id"])
db.execute("INSERT INTO transactions (user_id, symbol, action, price, quantity, date, time) VALUES (?, ?, ?, ?, ?, ?, ?)", session["user_id"], request.form.get("symbol"), undertaking, price, quantity, datetime.now().date(), datetime.now().time())
return redirect("/")
else:
return render_template("buyit.html")
@app.route("/history")
@login_required
def history():
"""Show history of transactions"""
ptfl = db.execute("SELECT * FROM transactions WHERE user_id = ?", session["user_id"])
return render_template("tracker.html", hist = ptfl)
@app.route("/login", methods=["GET", "POST"])
def login():
"""Log user in"""
# Forget any user_id
session.clear()
# User reached route via POST (as by submitting a form via POST)
if request.method == "POST":
# Ensure username was submitted
if not request.form.get("username"):
return apology("must provide username", 403)
# Ensure password was submitted
elif not request.form.get("password"):
return apology("must provide password", 403)
# Query database for username
rows = db.execute("SELECT * FROM users WHERE username = ?", request.form.get("username"))
# Ensure username exists and password is correct
if len(rows) != 1 or not check_password_hash(rows[0]["hash"], request.form.get("password")):
return apology("invalid username and/or password", 403)
# Remember which user has logged in
session["user_id"] = rows[0]["id"]
# Redirect user to home page
return redirect("/")
# User reached route via GET (as by clicking a link or via redirect)
else:
return render_template("login.html")
@app.route("/logout")
def logout():
"""Log user out"""
# Forget any user_id
session.clear()
# Redirect user to login form
return redirect("/")
@app.route("/quote", methods=["GET", "POST"])
@login_required
def quote():
"""Get stock quote."""
if request.method == "POST":
if not request.form.get("symbol"):
return apology("must provide stock symbol", 403)
if lookup(request.form.get("symbol")) == None:
return apology("No Match Found", 403)
stk = lookup(request.form.get("symbol"))
return render_template("quoted.html", stock=stk)
else:
return render_template("quotations.html")
@app.route("/register", methods=["GET", "POST"])
def register():
"""Register user"""
if request.method == "POST":
if not request.form.get("username"):
return apology("must provide username", 400)
# Ensure password was submitted
elif not request.form.get("password"):
return apology("must provide password", 400)
elif not request.form.get("confirmation"):
return apology("must provide confirmation", 400)
elif not request.form.get("confirmation") == request.form.get("password"):
return apology("password does not match confirmation", 400)
username = request.form.get("username")
users = db.execute("SELECT username FROM users")
for i in users:
if username == i['username']:
return apology("User already exists", 400)
hash = generate_password_hash(request.form.get("password"))
db.execute("INSERT INTO users (username, hash) VALUES (?, ?)", username, hash)
rows = db.execute("SELECT * FROM users WHERE username = ?", username)
session["user_id"] = rows[0]["id"]
return redirect("/login", 200)
# User reached route via GET (as by clicking a link or via redirect)
else:
return render_template("registration.html")
@app.route("/sell", methods=["GET", "POST"])
@login_required
def sell():
"""Sell shares of stock"""
if request.method == "POST":
if not request.form.get("symbol"):
return apology("must provide symbol", 403)
elif not request.form.get("shares"):
return apology("must provide password", 403)
elif not db.execute("SELECT quantity FROM purch WHERE user_id = ? AND symbol = ?", session["user_id"], request.form.get("symbol")):
return apology("operation not possible", 403)
q = db.execute("SELECT quantity FROM purch WHERE user_id = ? AND symbol = ?", session["user_id"], request.form.get("symbol"))
quant = q[0]["quantity"]
if quant < float(request.form.get("shares")):
return apology("not enough shares", 403)
cash_list = db.execute("SELECT cash FROM users WHERE id = ?", session["user_id"])
cash = float(cash_list[0]["cash"])
price = float(lookup(request.form.get("symbol"))['price'])
quantity = float(request.form.get("shares"))
earnings = quantity * price
user_name = db.execute("SELECT username FROM users WHERE id = ?", session["user_id"])
user = user_name[0]["username"]
money_left = cash + earnings
remainder = (quant - quantity)
undertaking = "Sold"
db.execute("UPDATE purch SET price = ?, quantity = ? WHERE user_id = ? AND symbol = ?", price, remainder, session["user_id"], request.form.get("symbol"))
db.execute("UPDATE users SET cash = ? WHERE id = ?", money_left, session["user_id"])
db.execute("INSERT INTO transactions (user_id, symbol, action, price, quantity, date, time) VALUES (?, ?, ?, ?, ?, ?, ?)", session["user_id"], request.form.get("symbol"), undertaking, price, quantity, datetime.now().date(), datetime.now().time())
return redirect("/", 200)
else:
return render_template("selloff.html")
@app.route("/change", methods=["GET", "POST"])
@login_required
def change():
"""Change user password"""
if request.method == "POST":
if not request.form.get("username"):
return apology("must provide username", 403)
elif not request.form.get("current"):
return apology("must provide previous", 403)
elif not request.form.get("new"):
return apology("must provide password", 403)
elif not request.form.get("confirmation"):
return apology("must provide confirmation", 403)
x = db.execute("SELECT * FROM users WHERE id = ?", session["user_id"])
now = x[0]["hash"]
if check_password_hash(now, request.form.get("new")):
return apology("This password is in use", 403)
elif not request.form.get("new") == request.form.get("confirmation"):
return apology("New password and confirmation don't match", 403)
if x[0]["username"] == request.form.get("username") and check_password_hash(now, request.form.get("current")):
db.execute("UPDATE users SET hash = ? WHERE id = ?", generate_password_hash(request.form.get("new")), session["user_id"])
else:
return apology("Username or Password doesn't match records", 403)
return redirect("/")
else:
return render_template("pwd.html")
-----------------------------------------------
{% extends "layout.html" %}
{% block title %}
Log In
{% endblock %}
{% block main %}
<form action="/login" method="post">
<div class="mb-3">
<input autocomplete="off" autofocus class="form-control mx-auto w-auto" id="username" name="username" placeholder="Username" type="text">
</div>
<div class="mb-3">
<input class="form-control mx-auto w-auto" id="password" name="password" placeholder="Password" type="password">
</div>
<button class="btn btn-primary" type="submit">Log In</button>
</form>
{% endblock %}
-----------------------------------------------
{% extends "layout.html" %}
{% block title %}
Registration
{% endblock %}
{% block main %}
<form action="/register" method="post">
<div class="mb-3">
<input autocomplete="off" autofocus class="form-control mx-auto w-auto" id="username" name="username" placeholder="Username" type="text">
</div>
<div class="mb-3">
<input class="form-control mx-auto w-auto" id="password" name="password" placeholder="Password" type="password">
<input class="form-control mx-auto w-auto" id="confirmation" name="confirmation" placeholder="confirmation" type="password">
</div>
<button class="btn btn-primary" type="submit">Register Me!</button>
</form>
{% endblock %}
-----------------------------------------------
{% extends "layout.html" %}
{% block title %}
Log In
{% endblock %}
{% block main %}
<form action="/login" method="post">
<div class="mb-3">
<input autocomplete="off" autofocus class="form-control mx-auto w-auto" id="username" name="username" placeholder="Username" type="text">
</div>
<div class="mb-3">
<input class="form-control mx-auto w-auto" id="password" name="password" placeholder="Password" type="password">
</div>
<button class="btn btn-primary" type="submit">Log In</button>
</form>
{% endblock %}
我尝试重新编辑登录、注册和更改密码函数,强行将 200 传递给返回函数,将 403 返回值单独更改为 200,以确定问题的根源。然而,没有任何效果。
我自己尝试过这个程序,效果很好。因此我希望它能顺利通过 check50。
这是403
if not db.execute("SELECT symbol FROM purch WHERE user_id = ?", session["user_id"]):
return apology("no stocks in portfolio", 403)
check50
注册一个没有持股的新用户。即使用户没有持有,程序也应该显示索引页面。