Подтвердить что ты не робот

Прочитать файл в App Engine с помощью Python?

Можно ли открыть файл в GAE только для чтения его содержимого и получения последнего измененного тега?

Я получаю файл IOError: [Errno 13] недоступен: Я знаю, что я не могу удалить или обновить, но я считаю, что чтение должно быть возможным Кто-нибудь сталкивался с подобной проблемой?

os.stat(f,'r').st_mtim
4b9b3361

Ответ 1

Вы, вероятно, объявили файл как статический в app.yaml. Статические файлы недоступны для вашего приложения; если вам нужно обслуживать их как статические файлы и читать их как файлы приложений, вам нужно включить в проект 2 копии (в идеале с помощью символических ссылок, поэтому фактически вам не нужно сохранять фактическую копию).

Обновление за ноябрь 2014:

Как указано в комментариях, вы можете сделать это с помощью флага application_readable:

application_readable

Дополнительно. По умолчанию файлы, объявленные в обработчиках статических файлов, загружаются как статические данные и предоставляются только конечным пользователям, они не могут читать приложение. Если для этого поля установлено значение true, файлы также загружаются в виде кодовых данных, поэтому ваше приложение может их прочесть. И то и другое загружается с вашего кода и ресурса хранения статических данных квоты.

См. https://cloud.google.com/appengine/docs/python/config/appconfig#Static_Directory_Handlers

Ответ 2

Вы можете читать файлы, но они находятся на Goooogle wacky GAE файловой системе, поэтому вам нужно использовать относительный путь. Я просто взломал быстрое приложение с файлом main.py и test.txt в той же папке. Не забывайте "e" на st_mtime.

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util


class MainHandler(webapp.RequestHandler):

  def get(self):
    path = os.path.join(os.path.split(__file__)[0], 'test.txt')

    self.response.out.write(os.stat(path).st_mtime)


def main():
  application = webapp.WSGIApplication([('/', MainHandler)],
                                       debug=True)
  util.run_wsgi_app(application)


if __name__ == '__main__':
  main()

Ответ 3

+1 для новой функции "application_readable: true". Перед использованием этой новой функции я столкнулся с проблемой с файловой системой GAEs " wacky", в то время как импортировать NLP Montylingua.

Проблема: Monty использует open (filename, 'rb') и указатель файла file_ptr.read() в байтах из статических файлов. Моя реализация работала на моей локальной системе Windows, но не удалась при развертывании!

Исправление: укажите ожидаемые байты для чтения file_ptr.read(4) # 4 двоичных байта

Похоже, что это связано с 64-битным сервером GAE, который хочет читать больше (по умолчанию 8 байтов). В любом случае, потребовалось некоторое время, чтобы найти эту проблему. Montylingua загружается сейчас.

Ответ 4

Я придумал странное, но работающее решение:) Jinja:)

Обслуживание статических файлов непосредственно иногда становится головной болью с GAE. Возможный компромисс с производительностью позволяет вам двигаться вперед вперед с Jinja

- url: /posts/(.*\.(md|mdown|markdown)) 
  mime_type: text/plain
  static_files: static/posts/\1
  upload: posts/(.*\.(md|mdown|markdown))



from jinja2 import Environment
from jinja2.loaders import FileSystemLoader
posts = Environment(loader=FileSystemLoader('static/posts/')) # Note that we use static_files folder defined in app.yaml
post = posts.get_template('2013-11-13.markdown')

import markdown2 # Does not need of course

class Main(webapp2.RequestHandler):

    def get ( self ):
        self.response.headers[ 'Content-Type' ] = 'text/html'

        self.response.write ( markdown2.markdown( post.render()) )  # Jinja + Markdown Render function

Вы его получили;) Я тестировал и работал.

Ответ 5

С webapp2, предположим, что у вас есть pages/index.html на том же пути, что и main.py:

#!/usr/bin/env python

import webapp2, os

class MainHandler(webapp2.RequestHandler):
    def get(self):
        path = os.path.join(os.path.split(__file__)[0], 'pages/index.html')
        with open(path, 'r') as f:
            page_content = f.read()
        self.response.write(page_content)

app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)