我有一個類,我正在實例化,然後傳入一個Tornado Web模板。這兩個函數都返回一個列表,但我錯過了將類本身作爲一個可迭代對象的事情。我擔心這是我做錯事的根本原因。我正在進行REST API調用,解析返回的XML並將一些數據返回給webapp。下面的代碼:實例化一個類作爲可迭代的
的API調用:
class GetVMList:
def __init__(self):
user = 'contoso\\administrator'
password = "apassword"
url = "http://scspf:8090/SC2012/VMM/Microsoft.Management.Odata.svc/VirtualMachines?$filter=VMMServer%20eq%20'scvmm'"
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, user, password)
# create the NTLM authentication handler
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman)
# create and install the opener
opener = urllib2.build_opener(auth_NTLM)
urllib2.install_opener(opener)
# retrieve the result
self.response = urllib2.urlopen(url)
self.data = self.response.read()
def name(self):
dom = parseString(self.data)
raw_xml = dom.getElementsByTagName('d:Name')
clean_xml = []
clean_data = []
for i in raw_xml:
clean_xml.append(i.toxml())
for i in clean_xml:
clean_data.append(i.replace('<d:Name>', '').replace('</d:Name>', ''))
return clean_data
def os(self):
dom = parseString(self.data)
raw_xml = dom.getElementsByTagName('d:OperatingSystem')
clean_xml = []
clean_data = []
for i in raw_xml:
clean_xml.append(i.toxml())
for i in clean_xml:
clean_data.append(i.replace('<d:OperatingSystem>', '').replace('</d:OperatingSystem>', ''))
return clean_data
的實例:
class ListHandler(tornado.web.RequestHandler):
def get(self):
self.render('temp/search.html', data='')
def post(self):
vm_list = GetVMList()
self.render('temp/search.html', data=vm_list)
然後在模板中包含此:
{% for vm in data %}
<li>{{ vm.name }} running {{ vm.os }}</li>
{% end %}
的錯誤是:TypeError: iteration over non-sequence
。我想我需要在我的課程中使用__iter__
,但我不確定我是否明白它的工作原理。
我沒有看到'__iter __()'方法,所以'GetVMList'類的實例當然不是可迭代的。另外,你可能不應該命名類GetVMList(),而應該命名爲'VMList()'...類是名詞,而不是動詞。最後,你可能真的想要一個迭代器/生成器,而不是一個類。最重要的是,一個* list *的虛擬機不會有'name'或'os',這些是各個虛擬機的屬性,但是你沒有提供任何指定你想要哪個虛擬機名稱或操作系統的方法的。你非常需要重新考慮你的設計。 – kindall 2012-07-12 20:49:48
應該返回什麼?例如'GetVMList()中的x:print x'應該打印什麼? – mgilson 2012-07-12 20:51:17
@ kindall非常感謝,這正是這種建議。這不是我所知道的很多;你的建議是非常有用的。我想'__iter__'是我需要的,但不確定如何實現它。 – Danielscottt 2012-07-12 23:39:33