Python:当只有一个输入错误时,如何在不激活所有flash msg的情况下为每个输入闪存一个msg

Python:当只有一个输入错误时,如何在不激活所有flash msg的情况下为每个输入闪存一个msg,python,html,flask,Python,Html,Flask,这是我键入未找到的代码时得到的结果: “ZZZ不是有效代码USD不是有效代码{value}不是有效金额” 仅仅添加了一个错误的输入,我就在其他所有输入上得到了一个错误的flash msg,而且我也没有得到数字。 我试着用elif,结果更糟 我刚刚在国家/地区列表中添加了“USD”代码,我取得了一些进展,我遇到的一些问题是amt_to_convert 输入一个“convert_from”正在使用国家/地区列表外的值 输入两个“金额转换”使用要转换的金额,愿望是一个数字 输入三个“convert_t

这是我键入未找到的代码时得到的结果: “ZZZ不是有效代码USD不是有效代码{value}不是有效金额” 仅仅添加了一个错误的输入,我就在其他所有输入上得到了一个错误的flash msg,而且我也没有得到数字。 我试着用elif,结果更糟

我刚刚在国家/地区列表中添加了“USD”代码,我取得了一些进展,我遇到的一些问题是amt_to_convert

输入一个“convert_from”正在使用国家/地区列表外的值

输入两个“金额转换”使用要转换的金额,愿望是一个数字

输入三个“convert_to”使用国家列表外的值

app.py

>home.html
{%block title%}货币兑换{%endblock%}
{对于类别,get_Flash_消息中的msg为%(其中_categories=true)%}

{{{msg}

{%endfor%} {%block content%} ↓ {{你的利率} {%endblock%}
>result.html
{%extends'home.html%}{%block title%}货币结果{%endblock%}{%block content%}
您从{{convert_from}}转换
In to{{convert_to}
您将得到{{value}}
{%endblock%}

根据您的错误,它将
ZZZ
USD
报告为无效国家。这导致人们怀疑你以某种方式将
USD
作为一个国家传递(从或转换为)。实际上,您应该检查在其中一个字段中输入的值是否正确

另外,我将重命名字段
value
,因为
value
在HTML和表单中有特定的含义(可以称之为
amt\u-to\u-convert
)。谁知道呢,它可能会干扰你的代码

另外,您肯定会得到一个金额错误,因为您正在检查它是否为浮点值,但您的表单会将其作为字符串传递给Flask,并且您没有立即将该值转换为浮点值(您只在将该值传递给convert函数时转换该值;您没有转换存储的变量)

将代码更改为
value=float(request.form.get('value'))


说明:当值不是float时,会引发错误,因此应将表单中的值转换为float

欢迎使用堆栈溢出。请阅读。为了更好地“解释你自己”,请:1)试着写一些像“我有下面的代码:”后面跟着代码;2) 试着写一些类似“我得到了这个错误信息:”,然后是错误,格式化为代码;3) 用完整的句子解释代码应该做什么,4)解释你自己是如何试图解决问题的,以及为什么没有帮助;5) 问一个以
结尾的清晰问题;6) 不要写道歉或闲聊。你也应该试着解决这个问题。请写错误跟踪日志,好像你在某个输入字段上遇到了异常。我没有收到python错误,我只是一次收到所有的flash消息。我故意添加ZZZ,以便只收到一个特定输入的flash消息,但是相反,我也得到了美元是无效的,现在如果我在外汇python列表中输入其中一个国家,我将得到转换结果,我试图用flash消息构建一个错误处理,这是要求的一部分。我将值更改为amt\u to\u convert,还是同样的问题我知道你在使用ZZZ,但你的错误是将美元报告为无效国家,所以我说检查你没有将美元作为国家而不是货币发送。您没有将美元列为国家/地区。在调用转换函数之前,是否可以尝试打印convert\u from、convert\u to、amt\u to\u convert的值。另外,请编辑您的问题,并包括您用于测试的3个字段的值。我在国家/地区列表中添加了“USD”,谢谢,我没有看到,现在amt_to_convert愿望是一个数字,这是导致问题的原因1)如果参数类型错误(包括空白参数),我假设您的转换函数将失败。如果是这样,那么您当前的代码将正常工作。2) 或者,在调用convert函数之前,您可以将测试从
except
块移动到。这意味着,从表单中检索值,然后检查它们。如果任何一个失败,您将返回一个错误。如果它们都通过了,则继续调用convert函数。我目前的解释唯一的缺点是错误会一个接一个地返回,除非修改代码(注释中没有足够的空间解释如何返回)
from flask import Flask, request, render_template, redirect, session, flash, url_for
from forex_python.converter import CurrencyRates, CurrencyCodes
from decimal import Decimal


app = Flask(__name__)
app.config['SECRET_KEY'] = "hakunamatata"

c = CurrencyRates(force_decimal=True)

countries = ['IDR', 'BGN', 'ILS', 'GBP', 'DKK', 'CAD', 'JPY', 'HUF', 'RON', 'MYR', 'SEK', 'SGD', 'HKD', 'AUD', 'CHF',
             'KRW', 'CNY', 'TRY', 'HRK', 'NZD', 'THB', 'EUR', 'NOK', 'RUB', 'INR', 'MXN', 'CZK', 'BRL', 'PLN', 'PHP', 'ZAR']


@app.route('/', methods=['POST', 'GET'])
def home_page():
    return render_template('home.html')


@app.route('/result', methods=['POST', 'GET'])
def convert_result():

    if request.method == "POST":
        try:
            convert_from = (request.form.get('convert_from').upper())
            value = request.form.get('value')
            convert_to = (request.form.get('convert_to').upper())
            result = c.convert(convert_from, convert_to, Decimal(value))
            return render_template("result.html", convert_from=convert_from, convert_to=convert_to, value=result)

        except:
# The three following flash msg will flash all at ones, even when only one input is wrong

            if (convert_from not in countries):
                flash(f"{convert_from} Not a valid code")
                print('convertFom')

            if (convert_to not in countries):
                flash(f"{convert_to} Not a valid code")
                print('convertTo')

            if (not isinstance(value, float)):
                flash("{value} Not a valid amount")
                print('value')

            if (convert_from not in countries or convert_to not in countries or not isinstance(value, float)):
                return redirect(url_for('home_page'))

            else:
                # result = c.convert(convert_from, convert_to, Decimal(value))

                return render_template("result.html", convert_from=convert_from, convert_to=convert_to, value=result)
>home.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}Currency Exchange{% endblock %}</title>

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
    <link rel="stylesheet" href="/static/style.css">

</head>

<body>

    {% for category,msg in get_flashed_messages(with_categories=true) %}
    <p class="{{category}}">{{msg}}</p>
    {% endfor %}
    <div class="container">
        {% block content %}
        <form action="/result" method="POST">
            <div class="col-sm-6">
                <input type="text" class="form-control" placeholder="Convert From" name="convert_from">
            </div>
            <div class="col-sm">
                <input type="text" class="form-control" placeholder="Amt" name="value">
            </div>

            <div class="col-sm-6">
                <input type="text" class="form-control" placeholder="Convert To" name="convert_to">

                <button id="exchange">
                <span>&#8595;</span>
            </button>

                <div class="result">
                    <div class="rate" id="rate">{{your_rate}}</div>
                </div>

        </form>
        {% endblock %}


        </div>

</body>

</html>

>result.html

{% extends 'home.html' %} {% block title %}Currency Result{% endblock %} {% block content %}
<h2>You conveted from {{convert_from}}</h2>
<h2>In to {{convert_to}}</h2>
<!-- <h2>The amount of {{value}}</h2> -->
<h2>You will get {{value}}</h2>

<!-- <button type="button" class="btn btn-outline-secondary">Home</button> -->
<a href="/" type="button" class="btn btn-outline-secondary">Home</a> {% endblock %}