2013-06-03 2 views
2

Мой новый сайт (для чтения книг) на самом деле использует статический контент для обслуживания страниц: у меня есть файл HTML, сохраненный в папке, и, чтобы обслуживать страницу, я прочитал ее и передать содержимое шаблону jinja2, чтобы показать все вместе. Ни одна база данных не удаляется, за исключением того, что идентификатор книги знает название.GAE: использование статического файла HTML и базы данных для обслуживания содержимого

Это работает отлично и быстро, но очевидно, что я должен «загружать» каждую новую книгу с помощью опции «Развернуть» из GAE SDK (из того, что я читал, нет доступа к файловой системе в GAE извне, как с FTP), что не оптимально.

Так что я думаю о сохранении содержимого HTML в базе данных, но: будет ли это увеличение базы данных? Я использую NDB, поэтому теоретически каждый пользователь, читающий книгу, получит кешированный результат из кеша NDB, как только он будет впервые прочитан. Это правильно?

Будет лучше передать html в базу данных? С точки зрения размера, это будет более 8k на страницу html. На страницах также есть файлы изображений, поэтому, чтобы избежать первоначальной проблемы с загрузкой каждой новой книги, я снова должен сохранять изображения в базе данных, правильно?

Пример страницы для книги будет like this

+0

Если у меня возникли вопросы, у вас есть HTML-страница для каждой главы вашей книги, верно? И вы хотите показать эту конкретную страницу в соответствии с выбранной книгой/разделом. Правильно? – Markon

+0

Right @Markon, это именно то, что я делаю на самом деле, получая каждую главу из файла. – Eagle

ответ

5

Google App Engine имеет специальный сервис для загрузки файлов, это называется Blobstore.

Вы можете написать страницу администрирования, которая позволит вам загружать файл и публиковать его. Вам нужно будет использовать базу данных для хранения только метаданные о каждом объекте: название книги, автор, взаимосвязанного изображения ...

Here's some documentation

+0

Спасибо @Icfseth, я знаю Blobstore, его цель - исключить то, что вы говорите: загружать (большие) файлы. Это будет полезно для загрузки изображений (всего за 8k, я предпочитаю сохранять текст HTML в текстовом поле). Итак, вы рекомендуете мне забыть мой фактический метод (статические файлы) и сохранить все в базе данных? Или вы говорите мне, чтобы я загружал файлы (изображения и файлы HTML), а затем делал процесс извлечения из базы данных в статический файл, поддерживая мою реальную систему только для чтения статических файлов. Умм, звучит неплохо, если это так. – Eagle

+1

Я бы лично пошел с базой данных. На данный момент вы, возможно, не заметили необходимости, но позже, когда вы захотите реализовать некоторые дополнительные функции (рейтинг, поиск по контенту, комментарии ...), вы по достоинству оцените тот факт, что вы пошли на это:) Используете ли вы Python или PHP (я слышал, что они добавили поддержку для него), вы можете легко интегрировать HTML-код, извлеченный в ваших шаблонах. –

+0

Спасибо @lcfseth, я тоже думаю. Я не делал этого раньше, потому что пытался свести к минимуму попадания в базу данных (меньше хитов, денег, которые вы экономите), но я надеюсь, что NDB будет работать хорошо и большую часть времени будет обслуживать кеш. – Eagle

1

Почему бы не загрузить содержимое с помощью Google Drive и сохранить содержимое в НБД. Читы не дорогие, а хранилище данных NDB очень быстро.

Вы можете использовать blobstore для изображений. Посмотрите на Google High Performance Image Serving, которая использует blobstore и get_serving_url из Image API.

+0

Я изучу вашу рекомендацию, но теперь я нашел более интересным, один из @Icfseth для создания своего «собственного FTP», загрузки файлов и сохранения внутренней папки в нужную папку. Таким образом я полностью сохраняю использование хранилища данных для статического содержимого. Благодарю. – Eagle

+0

Сохранение в правой папке ???? Вы не можете сохранять файлы в папках проекта. Вы должны прочитать blobstore для каждого элемента. Используя Google Диск, каждый автор и книга может иметь свою собственную папку «Диска», что делает ее очень простой для использования авторами для применения новых разделов и изменений. Таким образом, Google Drive действует как книга CMS. – voscausa

+0

Вы правы, невозможно сохранить файлы в GAE, я забыл об этом. Была хорошая идея, а? ;) Как жаль! Но тогда я думаю, что лучше использовать только blobs, если кеш NDB работает хорошо, только одно чтение будет сделано для определенной главы. Я не очень убежден в использовании Google Диска. Авторы не могут публиковать сами, только я могу это сделать. Я выберу это после некоторых тестов. Спасибо в любом случае. – Eagle

2

Если вы хотите реализовать «бедный человек», создайте папку с именем «книги» на верхнем уровне вашей папки приложения. Внутри этого создайте одну папку для каждой книги и внутри каждой из них создайте одну папку для каждой главы. Это даст вам структуру дерева для вашей библиотеки.

Затем в папке каждой книги создайте файл index.html, который будет являться титульной страницей и оглавлением. Он должен иметь ссылки на каждую главу. Внутри папки каждой главы создайте еще один файл index.html, содержащий HTML для этой главы. Все изображения для этой главы идут вместе с файлом index.html внутри этой папки, а все ссылки относительны, то есть: href = "picture.jpeg"

Измените свой файл app.yaml, чтобы открыть папку «books» как статический справочник:

handlers: 
- url: /books 
    static_dir: books 

Если вам никогда не придется менять содержимое книг, вы можете опубликовать каждую книгу только один раз и развернуть ее. Красота в том, что программирование не требуется, помимо редактирования HTML и app.yaml.

+0

Это почти то, что я на самом деле делаю, что является основой проблемы: мне нужно «развернуть» каждый раз, когда я хочу загрузить новую главу. Кроме того, невозможно сделать папку книги статичной, потому что тогда GAE не может обращаться к ее содержимому программно, чтобы читать HTML-файлы и включать их в мои шаблоны (я их протестировал). Но да, у меня есть структура/books/bookID/и каждая глава в каждой папке книги. Все изображения находятся в статической папке/img/ – Eagle

+0

Да, вам нужно либо развернуть, либо загрузить новую главу в хранилище данных/blobstore. Оба способа требуют, чтобы кто-то нажал кнопку. Создайте индекс и разверните его. –

+0

То есть, создайте индекс книг и разделов и поместите его в свой каталог шаблонов, чтобы вы могли прочитать его на GAE. –

1

Если вы структурируете объекты ndb правильно, накладные расходы будут минимальными.

В основном, всегда делайте чтение на основе клавиш.

Допустим, у вас есть:

def Template (ndb.model): 
    data = ndb.TextProperty() 

Затем вы можете сделать читается как:

key = ndb.Key(Template, 'bookname.html') 
data = key.get().data 

ОПРС автоматически Memcache это читает. Поэтому, пока memcache не выселяет их, они будут очень быстрыми и совершенно свободными.

Настоящая вещь для рассмотрения - размеры - ndb сущности ограничены (IIRC) 1 МБ. Если все ваши шаблоны будут меньше этого, тогда вы добры. Если они больше, я бы предложил использовать Blob Store. Вы все равно захотите использовать ndb для хранения ссылок на хранилище Blob, хотя :)

+0

Спасибо @Murph, за подтверждение моих подозрений в NDB. Одна вещь: data = key.get(). Data() 'почему последние данные()? Недостаточно ли с помощью 'data = key.get()'? – Eagle

+0

Woops, это должно быть только key.get(). Data. key.get() возвращает весь объект, затем .data получает свойство с именем «данные». – Murph

+0

Умм, хорошо спасибо, хорошо знать это для получения только поля. – Eagle

Смежные вопросы