2012-06-14 60 views
0

的cgi.escape部分(下同)投在開發服務器追蹤,但是當我註釋掉cgi.escape,我得到RequestHandler語法錯誤。我正在關注Google的教程,該教程包含2個用於1表單的提交按鈕,對於我而言,它和/符號一樣不清楚?形式行動;我的表單下面是1(不是2)提交按鈕,用於組合文本和電臺字段格式,所以我不確定我是否正確地做了最後一部分,甚至是表格​​。我已經擁有了所有的進口產品。必須在Datastore,電子表格或其他內容中獲得這些用戶表單值,不勝感激。「字符串轉換的過程中並不是所有的格式ARGS」回溯

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) 

回答

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 

讓我們拿出函數調用現在,作爲這裏的不是真正的問題。請注意,我還將刪除將完成函數調用的額外尾部括號。這是當您註釋掉最後一行時出現語法錯誤的原因 - 您也在註釋函數調用的近端括號,並且解釋器在完成之前將不允許新類的輸入。

這給我們留下了這一點:

我們留下什麼的是一個字符串格式化操作,格式"""string literal""" % (tuple, of, values)的。爲了使這個操作起作用,你需要爲你想要包含在字符串中的每個值添加說明符(我發現'鉤子'是一個稍微更具描述性的術語)。這些將始終以百分號開始,並具有一個或多個字符。你可以閱讀更多關於它at the Python Docs,但有幾個簡單的例子包括浮點值%d一個整數,%s爲一個字符串,%f

你的代碼示例有此操作,urllib.urlencode({"name": name})cgi.escape(name)兩個參數。但是,您的字符串不包含任何說明符(%s等),以便解釋器瞭解您希望放置的位置。

正如我所看到的那樣,您有兩種選擇 - 您可以將所有參數一起移除(但請確保爲self.response.out.write調用留下尾部支架!),或者放在需要它們的地方。

+0

感謝Hannele給出了一個清晰的解釋。我應該注意到%...說明符似乎是佔位符。只需刪除參數並在需要時回覆。非常感謝! – p1nesap

+0

@pavl ..你應該開始接受答案,如果他們有幫助..這裏是如何和爲什麼:http://meta.stackexchange.com/a/5235 – Lipis

相關問題