int() 関数を使用して整数入力のみを受け入れ、最小値を設定した数値の型を受け入れようとしています。しかし、5.0 のような入力を与えると、それを無効な入力として扱い、整数のみを受け入れる必要があることに気付きました。
<input autocomplete="off" class="form-control" min="0" name="shares" id="shares" placeholder="Shares" type="number">
def sell():
"""Sell shares of stock"""
rows = db.execute("SELECT * FROM tracker WHERE id=:id", id = session["user_id"])
if request.method == "GET":
return render_template("sell.html", rows = rows)
else:
symbol = request.form.get("symbol")
shares = request.form.get("shares")
if not shares:
return apology("missing shares",400)
if not symbol:
return apology("missing symbol",400)
lis = db.execute("SELECT * FROM tracker WHERE id=:id AND name=:name", id=session["user_id"], name=symbol)
share = int(shares)
if lis[0]["no"] < share:
return apology("too many shares",400)
price = lookup(symbol)["price"]
cost = price * share;
saving = db.execute("SELECT cash FROM users WHERE id=:id", id=session["user_id"])[0]["cash"]
db.execute("UPDATE users SET cash=:cash WHERE id=:id", cash=cost + saving, id=session["user_id"])
if lis[0]["no"] == share:
db.execute("DELETE FROM tracker WHERE id=:id AND name=:name", id=session["user_id"], name=symbol)
else:
db.execute("UPDATE tracker SET no=:no where id=:id AND name=:name",no=lis[0]["no"] - share,id=session["user_id"], name=symbol)
db.execute("UPDATE users SET cash=:cash WHERE id=:id", cash=saving+cost, id=session["user_id"])
flash("Sold!")
return redirect("/")
あなたの質問は、5.0 の失敗が問題であることを暗示していますが、回答へのコメントで 5.0 を拒否したいと述べています。それはどれですか、そして何が問題ですか?
– E-A
2020 年 9 月 3 日 13:25
ああ、残念です。問題は、5.0 は無効な入力として扱われる必要があるが、5 は有効なものとして扱われる必要があることです。
– ヴァルン ベルグリ
2020 年 9 月 3 日 13:34
------------------------
エラー コードは表示されませんが、HTML 入力が原因だと思われます。
更新
これを試してください:
<input autocomplete="off" class="form-control" step="0" name="shares" id="shares" placeholder="Shares" type="number">
更新:
明らかに、次のようなことを行うことで、代わりに Python でチェックを実行できます。
symbol = request.form.get("symbol")
shares = request.form.get("shares")
if not symbol:
return apology("missing symbol",400)
if shares:
try:
shares = int(shares)
except ValueError:
error = 'It must be an integer'
return redirect("/", error=error)
else:
return apology("missing shares",400)
lis = db.execute("SELECT * FROM tracker WHERE id=:id AND name=:name", id=session["user_id"], name=symbol)
if lis[0]["no"] < share:
return apology("too many shares",400)
(参考までに、古い回答を残しておきます)
共有は文字列になるため、これは機能しません
shares = intrequest.form.get("shares")
if isinstance(shares, float)):
error = 'It must be an integer'
return redirect("/", error=error)
これは、最初に が float かどうかをチェックし、そうであればリダイレクトし、それ以外の場合は に変えるため、機能します。
4
しかし、私が望む動作は、5.0 または 4.0 などの浮動小数点値が入力された場合に拒否することです。
– ヴァルン ベルグリ
2020 年 9 月 3 日 12:45
はい、誤解していました。同じロジックを使用しますが、 step="0" を追加します。それはうまくいくか、代わりにサーバー側で処理する必要があります
– フェデリコ・バù
2020 年 9 月 3 日 15:04
これを聞くのを忘れていました。shares は文字列なので、float または int に変換する必要があります。ただし、そうすると isinstance を使用できなくなります。
– ヴァルン ベルグリ
9 月 4 日、2 日020 9:03
その点については完全に正しいですが、リクエストが文字列であることをすっかり忘れていました。
– フェデリコ・バù
2020 年 9 月 4 日 11:20