Как обрабатывать загрузку html-контента в приложение AppEngine?

Я хотел бы разрешить своим пользователям загружать HTML-контент в мое веб-приложение AppEngine. Однако, если я использую Blobstore для загрузки всех файлов (файлов HTML, файлов css, изображений и т. д.), это вызывает проблему, поскольку все ссылки на другие файлы (страницы, ресурсы) не будут работать.

Я вижу две возможности, но обе они не очень красивы, и я бы хотел их не использовать:

  • Просмотрите все ссылки в html-файлах и измените их на соответствующий ключ BLOB-объекта.

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

Как я могу решить это элегантно, не переходя и не изменяя файлы моего пользователя?


person Fastas    schedule 14.12.2011    source источник
comment
Я не думаю, что есть более элегантное решение. Поскольку html должен содержать правильные пути к своим ресурсам (css/image и т. д.). Не могли бы вы подробнее объяснить, что такое пользовательский случай? Хотите, чтобы пользователь был в состоянии сделать? Кроме того, я бы сделал вокруг него html-фреймворк и попросил пользователя указать css/js в отдельной текстовой области и сохранить его как текст в хранилище данных. И используйте blobstore для изображений.   -  person fredrik    schedule 14.12.2011
comment
@fredrik Мой сайт будет своего рода контент-порталом, и мои пользователи будут загружать интерактивный HTML-контент, например, игры. Я бы не хотел навязывать своим пользователям какие-либо правила, когда они создают свой контент, плюс я бы не хотел возиться с их контентом после того, как они его загрузят...   -  person Fastas    schedule 14.12.2011


Ответы (2)


Сохранение сопоставления - лучший вариант здесь. Вам нужно каким-то образом идентифицировать группу файлов, поскольку несколько пользователей могут загрузить файл с одним и тем же именем, а затем связать уникальные пути с каждым файлом в этой группе. Вы можете использовать имена ключей, чтобы сделать хранилище данных простым для поиска большого двоичного объекта, связанного с заданным путем. Никаких перенаправлений не требуется — просто используйте стандартный подход к обслуживанию Blobstore, задав заголовок хранилища больших двоичных объектов, чтобы App Engine обслуживал большой двоичный объект пользователю.

Другой вариант — загрузить zip, как предлагает Фредерик. Однако нет необходимости распаковывать и хранить файлы по отдельности — вы можете передавать их прямо из ZIP-файла в blobstore, как это демонстрационное приложение.

person Nick Johnson    schedule 14.12.2011

Поскольку ядро ​​приложения запускает ваш контент на нескольких серверах, вы не можете выполнять запись в файловую систему. Что вы можете сделать, так это попросить их загрузить zip-файл, содержащий их html, css, js, изображения,... Модуль zipfile из python доступен в appengine, поэтому вы можете распаковать эти файлы и хранить их по отдельности. Таким образом, вы знаете структуру каталогов zip. Это позволяет создать сопоставление относительных путей к содержимому в хранилище больших двоичных объектов. У меня недостаточно опыта работы с zipfile, чтобы написать здесь полный пример, я надеюсь, что кто-то более опытный сможет отредактировать мой ответ или создать новый с примером.

person bigblind    schedule 14.12.2011