Прочитать файл в App Engine с помощью Python?
Можно ли открыть файл в GAE только для чтения его содержимого и получения последнего измененного тега?
Я получаю файл IOError: [Errno 13] недоступен:
Я знаю, что я не могу удалить или обновить, но я считаю, что чтение должно быть возможным
Кто-нибудь сталкивался с подобной проблемой?
os.stat(f,'r').st_mtim
Ответы
Ответ 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)