Flask request.form.get()返回NoneType引发TypeError问题排查
Flask表单运算触发NoneType报错修复方案
问题根因
你的代码存在两个直接触发报错的问题:
- 语法笔误:取day表单值的代码多写了一个多余的点,写法为
request.form.get('day'.),本身就会导致取值异常。 - 逻辑漏洞:路由同时支持GET、POST两种请求,当你直接访问页面、刷新页面时触发的是GET请求,此时
request.form中没有任何表单提交数据,所有form.get()拿到的返回值都是None,直接对None做加法运算、int类型转换必然触发TypeError。
你之前测试时只有点击提交按钮的POST场景能正常拿到值,所以print、模板渲染看似正常,但只要触发GET请求就会立刻报错。
正确实现方式
1. 拆分不同请求方法的处理逻辑
不要把页面渲染和表单提交处理的逻辑混写,GET请求只返回空表单,只有POST请求拿到提交数据后再做校验、运算,参考修正后的代码:
import datetime from datetime import timedelta from geopy.geocoders import Nominatim import astral from timezonefinder import TimezoneFinder from astral import LocationInfo from astral.sun import sun from flask import Flask, render_template, request app = Flask(__name__) @app.route("/planetaryhours", methods=['GET', 'POST']) def getinfo(): # GET请求:用户首次打开页面,返回带空表单的页面 if request.method == "GET": return render_template("planetaryhours.html") # 以下为POST提交逻辑:先取值再做校验 cityname = request.form.get("city", "").strip() countryname = request.form.get("region", "").strip() # 对数字类型的表单值直接做类型转换,加异常捕获 try: year = int(request.form.get("year")) month = int(request.form.get("month")) day = int(request.form.get("day")) except (TypeError, ValueError): return "请输入合法的年月日数值", 400 # 校验通过后再做业务计算 addtest = month + day # 后续行星时计算逻辑可以正常写在这里 return render_template( "planetaryhours.html", cityname=cityname, countryname=countryname, year=year, month=month, day=day, addtest=addtest )
2. 前端加必填校验减少无效请求
给表单输入框加上原生必填、取值范围限制,从前端先拦截空提交、非法值提交:
<form action="planetaryhours" method="POST"> <label for="city">City:</label><br> <input type="text" id ="city" name="city" required><br> <label for="region">Region:</label><br> <input type="text" id="region" name="region" required><br> <label for="month">Month (MM):</label><br> <input type="number" id="month" name="month" required min="1" max="12"> <label for="day">Day (DD):</label><br> <input type="number" id="day" name="day" required min="1" max="31"> <label for="year">Year (YYYY):</label><br> <input type="number" id="year" name="year" required min="1900" max="2100"> <input type="submit" value="Submit"/> </form>
注意:前端校验只能提升用户体验,后端的类型校验、异常捕获不能省略,避免用户绕过前端提交非法值触发报错。
内容的提问来源于stack exchange,提问作者mgbeke2
相关产品推荐
相关产品推荐

