You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask request.form.get()返回NoneType引发TypeError问题排查

Flask表单运算触发NoneType报错修复方案

问题根因

你的代码存在两个直接触发报错的问题:

  1. 语法笔误:取day表单值的代码多写了一个多余的点,写法为request.form.get('day'.),本身就会导致取值异常。
  2. 逻辑漏洞:路由同时支持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:57:17