Python - HTML フラスコ 整数入力のみを受け入れるには

okwaves2024-01-25  12

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

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。