cgi.escape部分(下面)在dev服务器中抛出traceback,但是当我注释掉cgi.escape时,我在RequestHandler上遇到语法错误。我正在关注Google的教程,其中包括1个表单的2个提交按钮,这对我来说不清楚,/符号是什么?形式行动;我的下面的表单是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)
答案 0 :(得分: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)
。要使此操作起作用,您需要为要包含在字符串中的每个值包含说明符(我发现'钩子'稍微更具描述性的术语)。这些将始终以百分号开头,并且后面有一个或多个字符。您可以阅读有关它的更多信息at the Python Docs,但是一些快速示例包括%d
表示整数,%s
表示字符串,%f
表示浮点值。
您的代码示例有两个用于此操作的参数urllib.urlencode({"name": name})
和cgi.escape(name)
。但是,您的字符串不包含任何说明符(%s
等),以便解释器了解您希望将它们放在何处。
正如我所看到的,你有两个选择 - 你可以一起删除所有参数(但要确保为self.response.out.write
调用留下一个尾随括号!),或者放在你需要它们的钩子里