0

cgi.escape セクション (以下) は開発サーバーでトレースバックをスローしますが、cgi.escape をコメントアウトすると、RequestHandler で構文エラーが発生します。/sign と同様に、1 つのフォームに 2 つの送信ボタンが含まれている Google のチュートリアルに従っています。フォームアクション; 以下の私のフォームは、テキストとラジオ フィールド フォームを組み合わせた 1 つ (2 つではありません) の送信ボタンであるため、最後のセクションを適切に実行しているか、フォームを実行しているかさえわかりません。これが機能するためのすべてのインポートがあります。これらのユーザーフォームの値をデータストア、スプレッドシート、または何かで取得する必要があります...助けていただければ幸いです。

Traceback (most recent call last):   Fil "/home/paul/Desktop/google_appengine/google/appengine/ext/webapp/_webapp25.py", line 701, in __call__
    handler.get(*groups)   File "/home/paul/Desktop/emot/index.py", line 39, in get
    cgi.escape(name))) TypeError: not all arguments converted during string formatting

コード:

    name=self.request.get("name")
        self.response.out.write("""
        <form action="/sign?/s" method="post">
            <p>First Name: <input type="text" name="name"/></p>
            <p><input type="radio" name="mood" value="good">Good</p>
            <p><input type="radio" name="mood" value="bad">Bad</p>
            <p><input type="radio" name="mood" value="fair">Fair</p>
            <p><input type="submit"value="Process"></p>
        </form>
    </body>
</html>""" % (urllib.urlencode({"name": name}), 
                    cgi.escape(name)))       # < < < no string convert HERE 

class Info(webapp.RequestHandler):     # < < Syntax Error when ^ ^ is commented out.
    def post(self):
        name = self.request.get("name")
        visitor = Visitor(parent=info_key(name))
        visitor.content = self.request.get("mood")
        visitor.put()
        self.redirect("/?" + urllib.urlencode({"name": name}))

application = webapp.WSGIApplication([
    ("/", MainPage),            # < < v v Unsure about these...2 submits?
    ("/sign", Info)
], debug=True)
4

1 に答える 1

3

ここで問題が発生します。このコードのチャンク全体が関数呼び出しでラップされていることに注意してください。

self.response.out.write("""
    <form action="/sign?/s" method="post">
        <p>First Name: <input type="text" name="name"/></p>
        <p><input type="radio" name="mood" value="good">Good</p>
        <p><input type="radio" name="mood" value="bad">Bad</p>
        <p><input type="radio" name="mood" value="fair">Fair</p>
        <p><input type="submit"value="Process"></p>
    </form>
</body>
</html>""" % (urllib.urlencode({"name": name}), 
                cgi.escape(name))) # self.response.out.write ends here

ここでは実際の問題ではないので、ここでは関数呼び出しを取り出しましょう。関数呼び出しを終了する余分な末尾のブラケットも削除することに注意してください。これが、最後の行をコメントアウトしたときに構文エラーが発生した理由です。関数呼び出しの閉じ括弧もコメントアウトしていたため、インタープリターはdef完了するまで新しいクラスの ining を許可しません。

残りは次のとおりです。

"""
<form action="/sign?/s" method="post">
        <p>First Name: <input type="text" name="name"/></p>
        <p><input type="radio" name="mood" value="good">Good</p>
        <p><input type="radio" name="mood" value="bad">Bad</p>
        <p><input type="radio" name="mood" value="fair">Fair</p>
        <p><input type="submit"value="Process"></p>
    </form>
</body>
</html>""" % (urllib.urlencode({"name": name}), 
                cgi.escape(name)) # one less bracket!

残っているのは、 format の文字列フォーマット操作です"""string literal""" % (tuple, of, values)。この操作を機能させるには、文字列に含めたい値ごとに指定子 ('フック' はもう少しわかりやすい用語だと思います) を含める必要があります。これらは常にパーセント記号で始まり、1 つ以上の文字が続きます。詳しくは Python Docs で読むことができますが%d、整数、%s文字列、%f浮動小数点値の簡単な例をいくつか示します。

コード例には、この操作の と の 2 つの引数がurllib.urlencode({"name": name})ありcgi.escape(name)ます。%sただし、文字列には、インタープリターがどこに配置したいかを理解するための指定子 ( など) が含まれていません。

私が見たように、2 つの選択肢があります。引数をすべて削除するか (ただし、呼び出しの末尾のブラケットを必ず残してくださいself.response.out.write!)、必要な場所にフックを挿入することができます。

于 2012-06-14T03:00:38.250 に答える