繁体   English   中英

将变量从一个 function 传递到另一个 Flask 时出现类型错误

[英]TypeError when passing a variable from one function to another in Flask

我在我的 Flask 应用程序中创建了 2 条路由,这些路由从第一个 function 获取值,然后在第二条路由中完成进一步的操作,但我收到一个错误,说明TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

这是我的 routes.py 文件

@app.route('/getdetails', methods=['GET', 'POST'])
def getdetails():
    if request.method == 'POST':
        name = request.form['name']
        sems = request.form['sems']
        sems=int(sems)
        return render_template('new.html', n=name, s=sems)
    return render_template('index.html')

@app.route('/getmarks', methods=['GET', 'POST'])
def getmarks():
    sems = request.args.get('sems')
    sems = int(sems)
    for i in range(sems):
        if request.method == 'POST':
            sgp = request.form['sgpa']
            sgp = int(sgp)
            marks.append(sgp)
    return render_template('getmarks.html', s=sems, marks=marks)

这里还有 html 模板

{% block content %}

<form name="inputmarks" action="/getmarks" method="POST" style="width: 500px; margin: auto">
    {% for i in range(s) %}
        <label>SGPA {{i}}: </label>
        <input type="text" name="sgpa" class="form-control">
        <input type="submit" value="Lets Go">
    {% endfor %}    
</form>

我请求的变量是“int”类型,但是当我打印该类型时,它显示我的类型为“无类型”我该如何解决这个问题?

变量 sems 是我要求的值

该错误可能是由这两行中的第二行引起的:

sgp = request.form['sgpa']
sgp = int(sgp)

提交的表单要么是空的,要么没有传入文本值。

尝试添加打印语句来检查sgp的第一个值

sgp = request.form['sgpa']
print('sgp =', sgp)
sgp = int(sgp)

问题很可能出在getmarks function 的开头。

@app.route('/getmarks', methods=['GET', 'POST'])
def getmarks():
    sems = request.args.get('sems')
    sems = int(sems)

您检索值sems的方式很可能与您提供的形式不一致,因此, sems最终为None ,导致调用int()时出错。

为什么会这样? 这是因为发布的数据在 HTTP 调用中不是持久的。 getdetails 处理的请求sems getdetails值(我假设它是,即使您没有为此提供 HTML 表单),并不意味着相同的值会自动通过(作为formargs中的值)到后续的 HTTP 请求,包括由getmarks处理的请求。

您需要在第二个表单中嵌入从第一个表单发布的任何 arguments,您希望通过第二个表单发布。 您可以通过多种方式执行此操作:

  • 您可以在第二个表单中创建一个不可见字段,其名称与第一个表单中的名称相同,并将其设置为与第一个请求发布的值相等的初始值。 这将要求您通过 Flask 请求的form属性访问此字段,而不是通过args属性。
  • 您可以将表单目标的值部分作为 GET 样式的参数。 不过,我不会推荐这种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM