1

我是一个应用程序开发菜鸟。我正在使用 pycharm 进行编码,并将其与谷歌应用程序引擎链接起来,因此我可以使用 JetBrains 提供的便捷运行和调试功能来测试我的代码。我在同一目录中有一个名为 validation.py 的单独文件,其中包含真正的 valid_month、valid_day、valid_year 函数。我遇到的问题是这个(此时我很困惑)。这段代码早些时候生成了一个显示表单数据的html页面(我认为这与我的get(self)函数被更改为write_form有关,因为它不是更早的),但即使表单数据是显示,我将输入用户所需的信息,该页面将像“get”一样操作数据并将数据放入 URL。现在,使用 write_form 我' 我什至没有生成页面我只是得到错误。请记住,我是通过 CS253 Udacity Web 开发课程来完成这项工作的,所以我的代码模仿了课堂上的代码,但我使用的是 webapp 而不是 webapp2。

这是代码

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from validation import valid_day, valid_month, valid_year

months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
month_abbvs = dict((m[:3], m) for m in months)

def valid_month(user_month):
    return True

def valid_day(user_day):
    return True

def valid_year(user_year):
    return True


form ="""
<form method="post">
    What is your birthday?
    <br>
    <label>Month <input type="text" name="month" value="%(month)s"></label>
    <br>
    <label>Day <input type="text" name="day" value="%(day)s"></label>
    <br>
    <label>Year <input type="text" name="year" value="%(year)s"></label>
    <div style="color:red">%(error)s</div>
    <br>
    <br>
    <input type="submit">
</form>
"""



class OTWHandler(webapp.RequestHandler):

    def write_form(self, error=""):
        self.response.out.write(form % {"error": error})

    def get(self):
        self.write_form()

    def post(self):
        user_month = valid_month(self.request.get('month'))
        user_day = valid_day(self.request.get('day'))
        user_year = valid_year(self.request.get('year'))


        if not (user_month and user_day and user_year):
            self.write_form("Invalid entry")
        else:
            self.response.out.write("That is totally a valid day!")


def main():
    app = webapp.WSGIApplication([('/', OTWHandler)], debug=True)
    util.run_wsgi_app(app)

这是错误

Traceback (most recent call last):
  File "C:\Program Files\Google\google_appengine\lib\webapp2\webapp2.py", line 1536, in __call__
    rv = self.handle_exception(request, response, e)
  File "C:\Program Files\Google\google_appengine\lib\webapp2\webapp2.py", line 1530, in __call__
    rv = self.router.dispatch(request, response)
  File "C:\Program Files\Google\google_appengine\lib\webapp2\webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "C:\Program Files\Google\google_appengine\lib\webapp2\webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "C:\Program Files\Google\google_appengine\lib\webapp2\webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "C:\Program Files\Google\google_appengine\lib\webapp2\webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "C:\Users\Madrigal\PycharmProjects\OTW\otw.py", line 42, in get
    self.write_form()
  File "C:\Users\Madrigal\PycharmProjects\OTW\otw.py", line 39, in write_form
    self.response.out.write(form % {"error": error})
KeyError: 'month'

非常感谢您的回复。谢谢。

4

2 回答 2

2

该问题与您传递给form字符串的字典有关。如果你看一下你的form,你会看到看起来像这样的值%(month)s——这意味着form期待一个被调用的参数month被传递给它,并且它将返回相应的值。现在的问题是您(我假设)向GET页面发出请求,当发生这种情况时,您传递给的值字典form只有一个值 - error。因此,当form查找时month,它找不到任何东西并返回 KeyError。

一个简单的例子可以做到这一点:

def write_form(self, error=""):
    test_date = datetime.date(2012, 11, 26)
    my_values = {
        'month': test_date.month, 
        'day': test_date.day, 
        'year': test_date.year, 
        'error': error
        }
    self.response.out.write(form % my_values)

将日期参数作为函数的一部分会更好,但希望这个概念是有意义的——对于你的每个%(something)格式化字符串form,你需要传入一个相应的键/值参数,以便它知道要加载什么。

于 2012-11-26T18:20:38.277 回答
1

顺便说一句,我已经改变了这一点。我猜在我这样做之前复制了代码。

def write_form(self, error="", month="", day="", year=""):
   self.response.out.write(form % {"error": error, "month": month, "day": day, "year": year} )
于 2012-11-26T18:17:52.313 回答