pset9 财务预期状态代码 200,但得到 403

问题描述 投票:0回答:1

我刚刚完成 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。

cs50
1个回答
0
投票

这是403

if not db.execute("SELECT symbol FROM purch WHERE user_id = ?", session["user_id"]):
            return apology("no stocks in portfolio", 403)

check50
注册一个没有持股的新用户。即使用户没有持有,程序也应该显示索引页面。

© www.soinside.com 2019 - 2024. All rights reserved.