属性lat必须是我的仪表板中显示的浮动

时间:2011-04-13 10:30:11

标签: python google-app-engine floating-point cron

我创建了一个Google AppEngine项目,该项目接收.txt文件,查找文件中的位置,并使用Yahoo Placemaker在地图上绘制制造商以表示.txt文件。 当我在我的本地主机上运行时,该项目工作正常,但当我尝试将其上传到appspot时,我收到错误:

  

BadValueError:属性lat必须是float

我的main.py看起来像这样:

class Story(db.Model):
    id = db.StringProperty()
    loc_name = db.StringProperty()
    title = db.StringProperty()
    lat = db.FloatProperty()
    long = db.FloatProperty()
    link = db.StringProperty()

class MyStories(webapp.RequestHandler):
    def get(self):
        temp = db.Query(Story)
        temp = temp.count()


        story_set = Story.all()

        template_values = {
            'storyTemp': story_set
        }

        path = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(template.render(path, template_values))

class place(webapp.RequestHandler):
    def get(self):
        path = '/Users/kimmasterson/storing/txtFiles'

           try:
            for infile in glob.glob(os.path.join(path, '*.txt')):
                    #print infile
                    f = open(infile, 'r')
                    data = f.read()
                    newfile = infile.replace('.txt', '')
                    newfile = newfile.replace('/Users/kimmasterson/storing/txtFiles/', '')
                    #print newfile
                    storyname = 'http://www.independent.ie/national-news/' + newfile
                    #print storyname
                    #print newfile
                    #logging.info(data)
                    p = placemaker('HSnG9pPV34EUBcexz.tDYuSrZ8Hnp.LowswI7TxreF8sXrdpVyVIKB4uPGXBYOA9VjjF1Ca42ipd_KhdJsKYjI5cXRo0eJM-')
                    print p.find_places(data)
                    for place in p.places:
                        splitted = place.name.split()
                        for word in splitted:
                            temp = db.Query(Story)
                            temp = temp.filter("link = ", storyname)
                            results = temp.fetch(limit=1)
                            if len(results) >0:
                                break
                            elif 'IE' in word:
                                print temp
                                print 'success'
                                story = Story(name=newfile, lat=place.centroid.latitude, long=place.centroid.longitude, link=storyname, loc_name = place.name, title = newfile).put()
        except:
            print 'error'
            logging.info('BIG FAT ERROR')

def main():
    application = webapp.WSGIApplication([('/', MyStories), ('/place', place)],
                                         debug=True)

    wsgiref.handlers.CGIHandler().run(application)


if __name__ == '__main__':
    main()

我的cron.yaml:

cron:
- description: running place

  url: /place

  schedule: every day 10:00

由于某种原因,它会添加地点并将文件链接到我的localhost上的地图。任何想法如何在两个地方的相同代码可以在一个而不是在另一个中工作?

2 个答案:

答案 0 :(得分:2)

  1. 非常明显:path = '/Users/kimmasterson/storing/txtFiles' - 我希望你不会将其完全上传到Appengine,因为很明显,这不会在远程服务器上运行。

  2. 如果您打印出有关place的一些详细信息,那么您在错误发生前会得到什么?

  3. 修改

    看看你想要做什么,我认为你实际上不需要上传文本文件。你试图从independent.ie网站上的故事中获取地点,对吧?您只需将URL传递给placemaker:

    即可
    p.find_places("http://www.independent.ie/national-news/patient-too-large-for-ambulance-2619414.html")
    

    雅虎将直接从independent.ie获取该页面,而不是从您的应用程序发送该页面。

答案 1 :(得分:0)

显而易见的答案是lat(你从place.centroid.latitude得到的)不是浮点数。尝试记录type(place.centroid.latitude)以查看它是什么类型 - 我的猜测是它是一个字符串,你需要在其上调用float()来解析它。

正如@Thomas指出的那样,您显然无法引用本地计算机上的文件,并希望它在上传到App Engine后能够正常工作。而是将静态数据放在应用程序的根目录(或子目录)中,并使用相对路径打开它。最简单,最强大的方法就是这样:

path = os.path.join(os.path.dirname(__file__), 'path/to/your/file')