Читать файл на App Engine с Python? - PullRequest
39 голосов
/ 13 апреля 2010

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

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

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

Ответы [ 5 ]

54 голосов
/ 13 апреля 2010

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

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

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

application_readable

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

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

11 голосов
/ 13 апреля 2010

Вы можете читать файлы, но они находятся в дурацкой файловой системе GAE от Goooogle, поэтому вы должны использовать относительный путь. Я только что создал быстрое приложение с файлом 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()
6 голосов
/ 04 июля 2013

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

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

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

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

2 голосов
/ 15 декабря 2013

Я нашел странное, но рабочее решение :) Джинджа:)

Служба статических файлов напрямую иногда становится головной болью с 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

Ты понял;) Я проверил, и это сработало.

1 голос
/ 25 апреля 2017

В 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...