所以我正在构建一个基本博客,我还实现了一个IP地址API来存储用户的位置。我已经使用this website的API来获取用户的经度和纬度。这是Entries
类,用于存储每个条目 -
class Entries(db.Model):
title = db.StringProperty(required = True)
body = db.TextProperty(required = True)
created = db.DateTimeProperty(auto_now_add = True)
coords = db.GeoPtProperty()
这是将纬度和经度存储在coords
属性 -
IP_URL = 'http://ip-api.com/xml/'
def get_coords(ip):
ip = '4.2.2.2'
url = IP_URL + ip
content = None
try:
content = urllib2.urlopen(url).read()
except urllib2.URLError:
return
if content:
# parse the XML and find the coordinates
dom = minidom.parseString(content)
status = dom.getElementsByTagName("status")[0].childNodes[0].nodeValue
if status == 'success':
lonNode = dom.getElementsByTagName('lon')[0]
latNode = dom.getElementsByTagName('lat')[0]
if lonNode and latNode and lonNode.childNodes[0].nodeValue and latNode.childNodes[0].nodeValue:
lon = lonNode.childNodes[0].nodeValue
lat = latNode.childNodes[0].nodeValue
return db.GeoPt(lat, lon)
当我转到管理页面(localhost:8000
)时,我可以看到某些条目具有coords
属性,而其他条目则没有。 (确切地说,我目前有8个条目,其中6个在coords
列中没有任何内容,1个的坐标为4.2.2.2
,另一个有None
,因为我已经通过了我的localhost
地址。)
我有一个主页面,其中列出了博客中的所有条目,我在这里试图查看是否可以实际获得存储在数据库中的所有坐标,以显示在页面上 -
class MainPage(webapp2.RequestHandler):
def get(self):
# self.response.write(self.request.remote_addr)
# self.response.write(repr(get_coords(self.request.remote_addr)))
entries = db.GqlQuery('select * from Entries order by created desc limit 10')
# find which entries have coordinates
points = []
for e in entries:
if entries.coords:
points.append(a.coords)
self.response.write(repr(points))
self.response.write(render_str('mainpage.html', entries=entries))
我尝试打印出属性本身 - self.response.write(repr(get_coords(self.request.remote_addr)))
并显示datastore_types.GeoPt(40.7128, -74.0059)
。因此,似乎属性IS存储在数据存储区中。
我遇到的问题是解释器在AttributeError
的{{1}}中为循环抛出get
-
MainPage()
我认为这可能是因为某些条目首先没有AttributeError: 'GqlQuery' object has no attribute 'coords'
属性。但如果是这样的话,有什么办法吗?
如果它有用,我正在为Steve Huffman的Udacity开发Web开发课程,他展示了这种存储和显示用户坐标的方法。他指示不要将coords
用于required=True
属性,因为现有条目没有该属性。当他在博客中查看条目时,一切似乎都很好,所有坐标都显示为coords
。
答案 0 :(得分:1)
我设法解决了这个问题。
我在filter
内使用了for
代替MainPage
循环。
points = filter(None, (e.coords for e in entries))
这似乎有效并显示了坐标列表。 (虽然我仍然不明白为什么这种方法有效)
编辑:我发现为什么我的原始代码出现了问题。它应该是e.coords
,而不是entries.coords
。