2012-11-26 35 views
1

我是一個開發noob的應用程序。我使用pycharm編寫代碼,並將它與谷歌應用程序引擎連接起來,因此我可以使用JetBrains提供的便捷運行&調試功能來測試我的代碼。我在同一個目錄中有一個單獨的文件,名爲validation.py,其中包含valid_month,valid_day,valid_year函數。我碰到的問題是這個(我很困惑在這一點上)。這個代碼早些時候正在生成一個HTML頁面,其中顯示了表單數據(我認爲這與我的get(self)函數被更改爲write_form因爲它不是更早)有關,但即使表單數據是顯示,我會輸入用戶所需的信息,頁面將只處理像「get」這樣的數據並將數據放入URL中。現在,與write_form我甚至沒有生成一個頁面,我只是得到錯誤。請記住,我通過CS253 Udacity Web開發課程來完成此任務,因此我的代碼模仿了該課程,除了我使用的是webapp而不是webapp2。Pycharm&Google App引擎呈現請求發佈數據的問題

下面是代碼

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' 

您的回答也十分讚賞。謝謝。

回答

1

順便說一下,我已經改變了這一點。我猜測之前複製了代碼。

def write_form(self, error="", month="", day="", year=""): 
    self.response.out.write(form % {"error": error, "month": month, "day": day, "year": year}) 
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中,您需要傳入相應的鍵/值參數,以便它知道要加載的內容。

+0

我很感激! – madman2890

+0

@ madman2890沒問題 - 萬事如意! – RocketDonkey