Python 使用flask接收用户输入的问题

Python 使用flask接收用户输入的问题,python,html,python-3.x,flask,Python,Html,Python 3.x,Flask,这是我在几周前第一次学习python时编写的一个程序,它只需解二次公式,检查解是否无关,并找到二次图的一些关键特性,包括顶点、对称线,我甚至还得到了它来计算根号。这一切都很好,但它只在控制台工作 当我开始将它带到flask应用程序中,并修改它以接受用户输入时,它只适用于那些被证明是完美的数字,而不是小数。比如A=1b=4c=4。每当输入类似于A=2b=1C=4的内容时,它都会给我这个:HTTP405错误 main.py: from flask import Flask, render_templ

这是我在几周前第一次学习python时编写的一个程序,它只需解二次公式,检查解是否无关,并找到二次图的一些关键特性,包括顶点、对称线,我甚至还得到了它来计算根号。这一切都很好,但它只在控制台工作

当我开始将它带到flask应用程序中,并修改它以接受用户输入时,它只适用于那些被证明是完美的数字,而不是小数。比如A=1b=4c=4。每当输入类似于A=2b=1C=4的内容时,它都会给我这个:HTTP405错误

main.py:

from flask import Flask, render_template, request
import math

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def quadratic():
    if request.method == 'POST':
        a = float(request.form['a'])
        b = float(request.form['b'])
        c = float(request.form['c'])
        outside = b * -1
        bsquared = b ** 2
        four_a_c = 4 * a * c
        discriminant = bsquared - four_a_c
        bottom = 2 * a
        discriminant_sqrt = math.sqrt(discriminant)
        top = outside + discriminant_sqrt
        top2 = outside - discriminant_sqrt
        root = top/bottom
        root2 = top2/bottom
        equation = a * root ** 2 + b * root + c
        equation2 = a * root2 ** 2 + b * root + c
        if equation < 1 and equation > -1:
            Ex = "Not Extraneous"
        else:
            Ex = "Extraneous"
        if equation2 < 1 and equation2 > -1:
            Ex2 = "Not Extraneous"
        else:
            Ex2 = "Extraneous"

        return render_template('form.html', discriminant=discriminant, a=a, b=b, c=c, outside=outside, bsquared=bsquared, bottom=bottom, root=root, root2=root2, ex=Ex, ex2=Ex2)

    if request.method == 'GET':
        return render_template('form.html')

if __name__ == '__main__':
    app.run()
从烧瓶导入烧瓶,呈现模板,请求
输入数学
app=烧瓶(名称)
@app.route('/',方法=['GET','POST'])
def quadratic():
如果request.method==“POST”:
a=浮动(request.form['a'])
b=浮动(请求.表单['b'])
c=浮动(请求.表单['c'])
外部=b*-1
b平方=b**2
四个a_c=4*a*c
判别式=四次方-四次方
底部=2*a
discriminant_sqrt=math.sqrt(discriminant)
顶部=外部+判别式
top2=外部-判别式
根=顶部/底部
root2=顶部2/底部
方程=a*根**2+b*根+c
方程2=a*root2**2+b*root+c
如果方程式<1且方程式>-1:
Ex=“并非无关”
其他:
Ex=“无关的”
如果方程式2<1且方程式2>-1:
Ex2=“并非无关”
其他:
Ex2=“无关的”
返回呈现模板('form.html',discriminant=discriminant,a=a,b=b,c=c,outside=outside,bsquared=bsquared,bottom=bottom,root=root,root2=root2,ex=ex,ex2=ex2)
如果request.method==“GET”:
返回呈现模板('form.html')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run()
form.html:

<html>
<body>

<form method="POST" action=".">
  A <input id="post_form_id" name="a" value="" />
    B<input id ="post_form_id" name="b" value="" />
    C <input id ="post_form_id" name="c" value="" />
   <input type="submit" />
</form>
    <br />
    {% if a %}
    A: {{ a }} <br />
    B: {{ b }} <br />
    C: {{ c }} <br />
    Roots: <br />

    {{ outside }} + √{{ discriminant }} <br/>
    --------- <br/>
       {{ bottom }}<br/>

    {{ outside }} - √{{ discriminant }} <br/>
    --------- <br/>
       {{ bottom }}<br/>

    Approxomated Roots: <br/>
    {{ root }} <br/>
    {{ ex }}   <br/>
    {{ root2}} <br/>
    {{ ex2 }}  <br/>

    {% endif %}
</body>
</html>

A.
B
C

{%如果是%} A:{{A}}
B:{{B}}
C:{{C}}
根:
{{outside}}+√{{discriminant}}
---------
{{bottom}}
{{outside}}-√{{discriminant}}
---------
{{bottom}}
近似根:
{{root}}
{{ex}}
{{root2}}
{{ex2}}
{%endif%}
表单的
操作
属性应该是
/
,而不是
。如果这只是一个单页Flask应用程序,您甚至可以将
action
属性一起删除,以
POST
到表单来自的同一URL。

当您收到HTTP状态错误代码时,最好是在调试模式下运行应用程序。因为您希望在WSGI服务器后面运行应用程序,所以最简单的方法是将最后一行更改为

app.run(debug=True)
一旦您这样做,您将看到实际的错误。在这种情况下,它是

# snip
    discriminant_sqrt = math.sqrt(discriminant)
ValueError: math domain error
使用交互式调试器,我们可以检查原因

>>> discriminant
-31
那是你问题的根源。根据以下内容(为强调添加粗体):

CPython实现细节:数学模块主要由围绕平台C数学库函数的精简包装器组成。特殊情况下的行为遵循C99标准附录F(如适用)当前实现将为无效操作(如sqrt(-1.0)或log(0.0)(其中C99附录F建议发出无效操作信号或除以零)引发ValueError,并为溢出的结果(例如exp(1000.0))引发OverflowerError

math.sqrt(一个负数)
将引发一个
ValueError
。您给定的输入没有解决方案(或者没有复杂的解决方案,这取决于您如何看待它)。你能做的最好的事情就是检查这个案例,并向用户提供更好的反馈

try:
    discriminant_sqrt = math.sqrt(discriminant)
except ValueError:
    flash('There is no solution for the given inputs.', 'error')
else
    # continue with calculations

请不要把不必要的代码挂在墙上。请参阅帮助中的。该错误与问题中的代码不匹配。视图需要返回类似这样的响应,
quadraric
就是这样做的。