Свойство lat должно быть плавающим отображением в моей панели - PullRequest
1 голос
/ 13 апреля 2011

Я создал проект Google AppEngine, который принимает файл .txt, находит местоположения внутри файла и использует Yahoo Placemaker, чтобы нанести на карту создателя для представления файла .txt.Проект работает нормально, когда я запускаю на своем локальном хосте, но когда я пытаюсь загрузить его в appspot, я получаю ошибку:

BadValueError: Свойство lat должно быть плавающим

Мой 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

По какой-то причине он добавляет места и связывает файл с картой на моем локальном хосте.Любые идеи, как один и тот же код в обоих местах может работать в одном, а не в другом?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011
  1. Действительно очевидное: path = '/Users/kimmasterson/storing/txtFiles' - Я надеюсь, что вы не загружаете именно это в Appengine, потому что, очевидно, это не будет работать на удаленном сервере.

  2. Если вы напечатаете некоторые подробности о place, что вы получите непосредственно перед ошибкой?

РЕДАКТИРОВАТЬ:

Lookingна то, что вы пытаетесь сделать, я не думаю, что вам действительно нужно загружать текстовые файлы.Вы пытаетесь найти места из историй на сайте independent.ie, верно?Вы можете просто передать URL-адрес плеймейкеру:

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

Yahoo получит страницу из Independent.ie напрямую, а не отправит ее из вашего приложения.

0 голосов
/ 14 апреля 2011

Очевидный ответ таков: lat (который вы получаете от place.centroid.latitude) - это не число с плавающей точкой. Попробуйте войти type(place.centroid.latitude), чтобы увидеть, какой это тип - я думаю, что это строка, и вам нужно вызвать float() для ее анализа.

Как указывает @Thomas, вы, очевидно, не можете ссылаться на файл на локальном компьютере и ожидать, что он будет работать после загрузки в App Engine. Вместо этого поместите ваши статические данные в корневой каталог вашего приложения (или подкаталог) и откройте его с относительным путем. Самый простой и надежный способ сделать это так:

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