【问题标题】:form["x"] throws a KeyErrorform["x"] 抛出 KeyError
【发布时间】:2014-07-31 22:51:41
【问题描述】:

我正在处理一项任务,我们将创建一个 HTML 订单表单,然后通过 python 执行信息以创建第二个客户收据。

这是错误信息:

Traceback (most recent call last):
  File "F:\Assignment 3\page.py", line 17, in <module>
    print "<p>Customer Name:", form["custName"].value, "</p>"
  File "C:\Python27\lib\cgi.py", line 540, in __getitem__
    raise KeyError, key
KeyError: 'custName'

HTML:

<form action="page.py">

<div class="personalinfohead">
    <p>Personal Information:</p>
</div>

<div class="personalinfo">
    <div>Full name:
        <input type="text" name="custName" size="20" />
    </div>

    <div>Email address:
        <input type="text" name="custEmail"  size="50" />
    </div>

    <div>Street address:
        <input type="text" name="custAdd"  size="50" />
    </div>

    <div>City:
        <input type="text" name="custCity"  size="15" />
    </div>

    <div>Province:
        <input type="text" name="custProv"  size="2" maxlength="2" />
    </div>

    <div>Postal code:
        <input type="text" name="custPostal"  size="6" maxlength="6" />
    </div>
</div>

Python:

import cgi
form = cgi.FieldStorage()

# print HTTP/HTML header stuff
print """Content-type: text/html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html><head>
<title>Order Form</title>
</head><body>
"""

# print HTML body using form data
print "<h1>Kintoro Japanese Bar &amp; Restaurant</h1>"
print "<h2>Customer Reciept</h2>"
print "<p>Customer Name:", form["custName"].value, "</p>"
print "<p>Customer Email Address:", form["custEmail"].value, "</p>"
print "<h2>Customer Address:</h2>"
print "<p>Street:", form["custAdd"].value, "</p>"
print "<p>City:", form["custCity"].value, "</p>"
print "<p>Province:", form["custProv"].value, "</p>"
print "<p>Postal Code:", form["custPostal"].value, "</p>"

【问题讨论】:

  • form 中有什么内容?您的数据似乎没有正确填充。在尝试访问它之前抛出一个像print form这样的调试语句。
  • 第一条错误信息中的KeyError表示表单字典中没有“custName”键。
  • form 是我用来创建 html 订单表单的
    标签。我遵循了老师的指示,但我不明白为什么它显示为错误..
  • 是的,我知道 KeyError 指的是什么,但我清楚地将 文本框命名为 custName 所以 idk :/
  • 您是否在测试时将值放入 custName 字段?如果不是,这就是原因。你可能想做form = cgi.FieldStorage(keep_blank_values=True)

标签: python html cgi


【解决方案1】:

Jack 是正确的,但是对于未来的学生来说,有一个背景故事和快速/肮脏的测试方法。

先解释一下:

最初,您的 KeyError 表示没有具有该名称的 Key。在您隐含地声明了一个键(字典的第一部分)之后,它就缺少了该键的 Value

字典是一个键值对,因此两者都需要在脚本开头隐式声明(在前面和后面的易于调试方法的范围内)。

放慢动作有助于获得更清晰的理解;

由于这个脚本是一个完全加载的 CGI,它被告知通过为每个键值对声明变量来开始和结束,你会看到它的最终结果——python 将文本数据提供给 CGI,然后 CGI 接受并解释说文本,并给python返回某种响应(有效与否!),python只能给你结果的结果。因此,此错误看起来与您的标准(我可能会添加)非 cgi / 控制台错误不同,具有可跟踪的回溯。

一种快速/肮脏的测试方法:

在告诉 CGI 将其传递回 python 使用之前,隐式声明一个确切的键值对:

custName = { 'Name': 'John Smith' }

需要为提到的每个 dict 声明一个默认设置作为值,以便准备好使用完全可操作的加载脚本,但这里的提示是 custName 将不再出现错误,但它会抱怨你的下一个缺少键值对。

是的,很长的回答和过去的上课时间 - 我知道。但是,希望这将有助于理解一个“单一”问题的几个部分,而不是只为少数几个人解决一次。

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 2021-03-03
    • 2022-01-15
    • 2018-08-13
    • 1970-01-01
    • 2019-11-29
    • 2012-03-26
    • 1970-01-01
    相关资源
    最近更新 更多