Python 返回道歉(“必须再次输入密码”,400) elif not request.form.get(“密码”)==request.form.get(“密码2”): 返回道歉(“密码不匹配”,400) hash=generate\u password\u hash

Python 返回道歉(“必须再次输入密码”,400) elif not request.form.get(“密码”)==request.form.get(“密码2”): 返回道歉(“密码不匹配”,400) hash=generate\u password\u hash,python,html,python-3.x,sqlite,web,Python,Html,Python 3.x,Sqlite,Web,返回道歉(“必须再次输入密码”,400) elif not request.form.get(“密码”)==request.form.get(“密码2”): 返回道歉(“密码不匹配”,400) hash=generate\u password\u hash(request.form.get(“password”)) user_add=db.execute(“插入到用户(用户名,哈希)值中(:用户名,:哈希)”, 用户名=request.form.get(“用户名”), 散列=散列) 如果不是用户

返回道歉(“必须再次输入密码”,400) elif not request.form.get(“密码”)==request.form.get(“密码2”): 返回道歉(“密码不匹配”,400) hash=generate\u password\u hash(request.form.get(“password”)) user_add=db.execute(“插入到用户(用户名,哈希)值中(:用户名,:哈希)”, 用户名=request.form.get(“用户名”), 散列=散列) 如果不是用户添加: 回复道歉(“已使用用户名”,400) 会话[“用户id”]=用户添加 flash(“注册新用户”) 返回重定向(“/”) 其他: 返回呈现模板(“register.html”) @app.route(“/sell”,methods=[“GET”,“POST”]) @需要登录 def sell(): “出售股票” stocks=db.execute(“从投资组合中选择股票,其中id=:id按股票分组”,id=session[“user_id”]) 如果request.method==“POST”: 如果没有,则请求.form.get(“符号”): 返回道歉(“缺少符号”) elif not request.form.get(“股份”): 返回道歉(“丢失的股份”) shares\u sell=int(request.form.get(“股票”)) company\u symbol=查找(request.form.get(“symbol”)) 总计=公司符号[“价格”]*出售股份 如果没有报价: 返回道歉(“未找到符号!”)
欢迎来到stack exchange网络。您的问题可能会在网站上得到更好的关注,因为您对“代码检查”感兴趣。有关更多信息,请参阅。

from cs50 import SQL
from flask import Flask, flash, jsonify, redirect, render_template, request, session
from flask_session import Session
from tempfile import mkdtemp
from werkzeug.exceptions import default_exceptions, HTTPException, InternalServerError
from werkzeug.security import check_password_hash, generate_password_hash


from helpers import apology, login_required, lookup, usd

# Configure application
app = Flask(__name__,template_folder='templates')

# Ensure templates are auto-reloaded
app.config["TEMPLATES_AUTO_RELOAD"] = True

# Ensure responses aren't cached
@app.after_request
def after_request(response):
    response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
    response.headers["Expires"] = 0
    response.headers["Pragma"] = "no-cache"
    return response

# Custom filter
app.jinja_env.filters["usd"] = usd

# Configure session to use filesystem (instead of signed cookies)
app.config["SESSION_FILE_DIR"] = mkdtemp()
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)

# Configure CS50 Library to use SQLite database
db = SQL("sqlite:///finance.db")

# Make sure API key is set
if not os.environ.get("API_KEY"):
    raise RuntimeError("API_KEY not set")


@app.route("/")
@login_required
def index():
    """Show portfolio of stocks"""
    stocks = db.execute("SELECT stock, number FROM portfolio WHERE id = :id", id = session['user_id'])
    new_cash = db.execute("SELECT cash FROM users WHERE id = :id", id = session['user_id'])

    total_amount = float(new_cash[0]['cash'])

    final_amount = total_amount

    for stock in stocks:
             symbol = str(stock['stock'])
             number_shares = int(stock['number'])
             quote = lookup(symbol)
             price_per_share = float(quote['price'])
             total_price = float(price_per_share*number_shares)
             final_amount += total_price
    return render_template("index.html", stocks = stocks, cash = total_amount, final_amount = final_amount)



@app.route("/buy", methods=["GET", "POST"])
@login_required
def buy():
    if request.method == "POST":
        if not request.form.get("symbol"):
             return apology("Missing Symbol", 400)
        elif not int(request.form.get("shares")):
             return apology("Enter number of Shares", )
        elif not lookup(request.form.get("symbol")):
             return apology("Invalid Symbol")
        elif int(request.form.get("shares")) <= 0:
             return apology("Number of shares must be higher than 0!")


        available_cash = db.execute("SELECT cash FROM users WHERE id = :id", id = session['user_id'])
        num_shares = int(request.form.get("shares"))
        enquire_cash = float(available_cash[0]['cash'])
        stock = lookup(request.form.get("symbol"))
        amount = float(stock["price"]*num_shares)

        if enquire_cash >= amount:

            if db.execute("SELECT stock FROM portfolio WHERE  id = :user AND stock = :stock",user=session["user_id"] ,stock=request.form.get("symbol")):
              db.execute("UPDATE portfolio SET number = number + :number WHERE id = :id", id = session['user_id'], number = num_shares)
            else:
              db.execute("INSERT INTO portfolio(id, stock, number, price) VALUES(:id, :stock, :number, :price)", id = session['user_id'], stock = request.form.get("symbol"), number = num_shares, price = amount)

            db.execute("UPDATE users SET cash = cash - :spent WHERE id = :id", id = session['user_id'], spent = amount)
            return redirect("/")
        else:
            return apology("avaliable cash is less")


    else:
        return render_template("buy.html")



@app.route("/history")
@login_required
def history():
    """Show history of transactions"""
    return apology("TODO")


@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 = :username",
                          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():

    if request.method == "POST":

        if not request.form.get("symbol"):
             return apology("Missing Symbol", 400)

        newstock =  lookup(request.form.get("symbol"))

        if newstock == None:
            return apology("Stock cannot be found")

        return render_template("quoted.html", newstock = newstock)

    else:
        return render_template("quote.html")



@app.route("/register", methods=["GET", "POST"])
def register():
    """Register user"""


    if request.method == "POST":

        # Ensure username was submitted
        if not request.form.get("username"):
            flash("Username is not available")

        # Ensure password was submitted
        elif not request.form.get("password"):
            return apology("must enter password", 400)
        elif not request.form.get("password2"):
            return apology("must enter password again", 400)
        elif not request.form.get("password") == request.form.get("password2"):
             return apology("passwords do not match", 400)

        hash = generate_password_hash(request.form.get("password"))
        user_add = db.execute("INSERT INTO users (username, hash) VALUES(:username, :hash)",
                                 username=request.form.get("username"),
                                 hash=hash)

        if not  user_add:
           return apology("username taken", 400)

        session["user_id"] = user_add

        flash("Registered new user")

        return redirect("/")

    else:
        return render_template("register.html")

@app.route("/sell", methods=["GET", "POST"])
@login_required
def sell():
    """Sell shares of stock"""
    stocks = db.execute("SELECT stock FROM portfolio WHERE id = :id GROUP BY stock", id = session["user_id"])
    if request.method == "POST":
        if not request.form.get("symbol"):
            return apology("Missing Symbol")
        elif not request.form.get("shares"):
            return apology("Missing Shares")

        shares_sell = int(request.form.get("shares"))
        company_symbol = lookup(request.form.get("symbol"))
        total= company_symbol["price"] * shares_sell
        if not quote:
            return apology("Symbol not found!")
        elif shares_sell <= 0:
            return apology("Enter a positive number")
        db.execute("UPDATE portfolio SET number = number - :shares_sell WHERE id = :id AND stock = :stock", shares_sell = shares_sell, id = session["user_id"], stock=request.form.get("symbol"))
        db.execute("UPDATE portfolio SET price = price - :total WHERE id = :id AND stock = :stock", total = total, id = session["user_id"], stock=request.form.get("symbol"))
    return render_template("sell.html")


def errorhandler(e):
    """Handle error"""
    if not isinstance(e, HTTPException):
        e = InternalServerError()
    return apology(e.name, e.code)


# Listen for errors
for code in default_exceptions:
    app.errorhandler(code)(errorhandler)
    

{% extends "layout.html" %}

{% block title %}
    Table
{% endblock %}

{% block main %}
  <table class="table table-striped">
    <thead>
      <tr>
          <th scope="col">Symbol</th>
          <th scope="col">Name</th>
          <th scope="col">Shares</th>
          <th scope="col">Price</th>
          <th scope="col">TOTAL</th>
      </tr>
     </thead>
     <tbody>
        {% for stock in stocks %}
        <tr>
          <th scope="col">1</th>
          <td>{{ stock.symbol }} </td>
          <td>{{ stock.number_shares }}</td>
          <td>{{ stock.price_per_share }}</td>
          <td>{{ stock.total_price }}</td>
          </tr>
         {% endfor %}
  </tbody>
<tfoot>
  <tr>
   <td>Current cash balance: {{ cash }}<br></td>
     <td> Grand total value: {{ final_amount }}</td>
        </tr>
    </tfoot>

    </table>
{% endblock %}