Python Pycharm&;Google应用程序引擎呈现请求的post数据

Python Pycharm&;Google应用程序引擎呈现请求的post数据,python,google-app-engine,Python,Google App Engine,我是一个正在开发应用程序的noob。我正在使用pycharm从中编写代码,并将其与google app engine连接,因此我可以使用JetBrains提供的方便的运行和调试功能测试我的代码。我在同一个目录中有一个名为validation.py的单独文件,其中包含真正的valid\u month、valid\u day和valid\u year函数。我遇到的问题是(我在这一点上感到困惑)。这段代码之前生成了一个html页面,其中显示了表单数据(我认为这与我的get(self)函数被更改为wri

我是一个正在开发应用程序的noob。我正在使用pycharm从中编写代码,并将其与google app engine连接,因此我可以使用JetBrains提供的方便的运行和调试功能测试我的代码。我在同一个目录中有一个名为validation.py的单独文件,其中包含真正的valid\u month、valid\u day和valid\u year函数。我遇到的问题是(我在这一点上感到困惑)。这段代码之前生成了一个html页面,其中显示了表单数据(我认为这与我的get(self)函数被更改为write_form有关,因为它不是更早),但即使在显示表单数据并输入用户所需信息时,页面也只会像“get”一样操作数据并将数据放入URL中。现在,使用write_表单,我甚至没有生成页面,我只是得到了错误。请记住,我是通过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)

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

顺便说一句,我已经改变了这一点。我想是在我做这件事之前复制了代码

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

这个问题与传递到
表单
字符串中的词典有关。如果查看
表单
,您将看到类似
%(月)s
的值-这意味着
表单
希望传递一个名为
的参数,并返回相应的值。现在的问题是(我假设)您正在向页面发出一个
GET
请求,当这种情况发生时,您传递给
表单
的值字典只有一个值-
error
。因此,当
表单
查找
月份
时,它找不到任何内容并返回一个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)
最好将日期参数作为函数的一部分,但希望这个概念有意义-对于
表单中的每个
%(某物)
格式的字符串,您需要传入相应的键/值参数,以便它知道要加载什么

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)