1

私はnoobを開発しているアプリケーションです。私は pycharm を使用してコードを作成しており、Google アプリ エンジンとリンクしているため、JetBrains が提供する便利な実行およびデバッグ機能を使用してコードをテストできます。真のvalid_month、valid_day、valid_year関数を含むvalidation.pyという同じディレクトリに別のファイルがあります。私が遭遇した問題はこれです(私はこの時点で混乱しています)。このコードは、以前はフォーム データが表示された html ページを生成していました (以前ではなかったので、get(self) 関数が write_form に変更されたことと関係があると思います)。表示され、ユーザーが必要とする情報を入力すると、ページは「get」のようにデータを操作し、そのデータを URL に挿入します。さて、write_form I' m ページを生成することすらできません。エラーが発生するだけです。CS253 Udacity Web 開発コースでこれを行っているため、webapp2 ではなく webapp を使用していることを除いて、コードはクラスのコードを模倣していることに注意してください。

ここにコードがあります

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は1つの値しかありません- error。したがって、をform検索monthすると、何も見つからず、KeyErrorが返されます。

これを機能させる簡単な例の1つは、これを行うことです。

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 に答える