0

cgi.escape 部分(如下)在开发服务器中抛出回溯,但是当我注释掉 cgi.escape 时,我在 RequestHandler 上收到语法错误。我正在关注 Google 的教程,其中包括 1 个表单的 2 个提交按钮,这对我来说不清楚,就像 /sign? 形成行动;我下面的表单是 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创建新类。

这给我们留下了这个:

"""
<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!

我们剩下的是一个字符串格式化操作,格式为"""string literal""" % (tuple, of, values). 要使此操作起作用,您需要为要包含在字符串中的每个值包含说明符(我发现“钩子”是一个更具描述性的术语)。这些总是以百分号开头,后面有一个或多个字符。您可以在 Python Docs中阅读有关它的更多信息,但一些简单的示例包括%d整数、%s字符串和%f浮点值。

您的代码示例有两个用于此操作的参数urllib.urlencode({"name": name}), 和cgi.escape(name)。但是,您的字符串不包含任何说明符(%s等),以便解释器了解您希望将它们放在哪里。

正如我所看到的,您有两个选择 - 您可以一起删除所有参数(但请确保为self.response.out.write调用留下一个尾括号!),或者在需要它们的地方放入钩子。

于 2012-06-14T03:00:38.250 回答