0

私は、ユーザーの場所を格納するIPアドレスAPIも実装している基本的なブログを構築しています。私はthis websiteのAPIを使用して、ユーザーの緯度と経度を取得しました。私は管理者ページに移動する場合(一部の属性のみが存在する場合のGQLQueryオブジェクトの反復方法

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) 

-

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性で緯度と経度を格納する機能である - これは、各エントリを格納するために使用されるEntriesクラスでありますlocalhost:8000)、一部のエントリにはcoordsというプロパティが含まれていますが、一部のエントリにはないことがわかります。 (正確には、私は私が私のlocalhostアドレスに渡されていたので、1は4.2.2.2の座標を持ち、もう一方がNoneを持って、coords欄には何もありません6そのうち、現在8つのエントリを持っています。)

私が持っています

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)を示しています。したがって、プロパティはDatastoreに保存されているようです。

私が持っている問題は、インタプリタがループのためAttributeErrorを投げることですgetMainPage()の - 私はいくつかのエントリが最初でcoordsの属性を持っていないので、これはかもしれないと思う

AttributeError: 'GqlQuery' object has no attribute 'coords' 

場所。しかし、もしそうなら、それの周りには何か方法がありますか?

もし私がこれを使っているのであれば、私はSteve HuffmanのUdacityのWeb Developmentコースでこれをやっています。彼はユーザー座標を保存して表示するこの方法を示しました。彼はcoordsプロパティにはrequired=Trueを使用しないように指示しました。既存のエントリにはそのプロパティがないからです。彼がブログのエントリをループしたとき、すべてがうまく見え、すべての座標はlistと表示されました。

+0

これは誤字によって引き起こされたため、この質問も削除する可能性があります。 –

答えて

1

私は問題を解決することができました。

ループの代わりにfilterを使用しました。MainPageです。

points = filter(None, (e.coords for e in entries)) 

これは動作するように見え、座標のリストを表示しました。 (なぜこの方法がうまくいったのかまだ分かりませんが)

編集:元のコードに問題があるのがわかりました。 entries.coordsではなく、e.coordsであったはずです。

関連する問題