Блог ИТ склеротика. Простой файловый хостинг на Google App Engine

Страницы

Расширенный поиск в статьях блога

1 июня 2012 г.

Простой файловый хостинг на Google App Engine

 
Наверняка каждый из вас в своей жизни находил удобный для себя файловый хостинг, а через какое-то время обнаруживал, что на нем от количества рекламы начинают болеть глаза, условия уже далеко не такие лояльные и вообще пора бы уже найти что-то новое. Вариантов дальнейших действий два — или найти новый, пока еще не раскрученный файлообменник и использовать его, пока он не испортится, или организовать собственное решение. Для второго варианта, в свою очередь, можно приобрести хостинг (придется правда набить шишек, пока не найдется добросовестный хостер с качественными услугами) или воспользоваться облачным сервисом.
Довольно интересной находкой оказался PaaS-хостинг от Google — Google App Engine (далее GAE), который дает возможность хранить до 5 Гб файлов при 1 Гб входящего и 1 Гб исходящего трафика в день, и кроме всего прочего, в нем используется модель High Replication, то есть ваши данные будут хранится сразу на нескольких серверах по всему миру!
Особенностью GAE является несколько нестандартный интерфейс для работы с файлами, поэтому я и сделал собственный сервис, о чем расскажу в данной статье.

GAE дает возможность создавать приложения на Java, Go и Python. Так как первые два языка для меня почти незнакомы, я написал свой сервис на Python. Ранее можно было использовать только версию 2.5, что создавало определенные сложности, но недавно добавили поддержку 2.7, поэтому теперь не нужно вспоминать устаревшие подходы.

Чтобы начать использовать GAE, скачайте и установите Python версии 2.7, а также appengine SDK для своей операционной системы. Повествование будет вестись на примере версии SDK для Linux (в Windows и Mac есть удобный графический интерфейс, так что разобраться будет несложно, хотя можно делать все из консоли, как описано ниже).

Чтобы в дальнейшем было проще с настройками, рекомендуется заранее зарегистрировать приложение на http://appengine.google.com, нажав кнопку “Create application”. Вам предложат ввести уникальный идентификатор приложения, по которому оно будет доступно как поддомен appspot.com, а также название, которое в дальнейшем можно будет менять, в отличии от идентификатора. Все остальные настройки можно не трогать, в нашем случае они не имеют особого значения. Для начала работы, создайте папку с именем, которое соответствует вашему идентификатору, в которой будут храниться все файлы, относящиеся к приложению.

Любое приложение состоит, как минимум, из файла app.yaml, в котором размещены название приложения, версия исполняемой среды и описание обработчиков URL и различных ошибок. Обработчик URL состоит из регулярного выражения, с помощью которого проверяются ссылки, а также описания необходимых файлов. Отмечу, что в именах скриптов для обработчиков, теперь нужно ставить расширение (которое вообщем-то уже и не расширение, а объект в приложении) не ‘.py’, а ‘.app’

Для нашего приложения файл app.yaml имеет следующий вид:

application: fileshare # здесь вместо fileshare нужно подставить свой идентификатор
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /favicon\.ico
static_files: favicon.ico
upload: favicon\.ico

- url: /delete/.* # Ссылка для удаления файла
script: main.app
login: admin # Размещать и удалять файлы сможет только администратор приложения.

- url: /get/.* # ссылка для прямого доступа к файлу, открывать может кто угодно, хотя если добавить login: admin или login: required, скачать его сможет только администратор или любой пользователь Google соответственно.
script: main.app

- url: .* # Страница, на которой размещена информация обо всех загруженных файлах и форма для загрузки.
script: main.app
login: admin


Для хранения файлов, в App Engine есть специальное хранилище Blobstore, а для данных — Datastore (отмечу, что используется нереляционная модель хранения данных; для доступа к данным имеется собственный фреймворк, похожий на ORM из Django). В нашем приложении каждому файлу присвоен объект FileRecord в Datastore со встроенным уникальным целочисленным идентификатором (имеется в виду извлечение ключа объекта по id), содержащий в себе объект BlobReferenceProperty:

class FileRecord(db.Model):
blob = blobstore.BlobReferenceProperty()


Для более конкретного разбора URL и вообще, для инициализации приложения, в конце файла создается объект app, который является представителем WSGIApplication:

app = webapp2.WSGIApplication(
[('/', MainHandler),
('/upload', UploadHandler),
('/delete/([^/]+)?', DeleteHandler),
('/get/([^/]+)?', GetHandler),
], debug=False)


В зависимости от полученного URL, приложение запускает соответствующий обработчик. В данном случае частично дублируются обработчики из app.yaml, поскольку в нем указаны настройки для авторизации.

Приложение работает следующим образом:


  • При обращении к ‘/’ проводится авторизация пользователя, затем загружаются все записи и выводится форма для загрузки файла.
  • При обращении к ‘/upload’, которое происходит автоматически при загрузке файла, создается объкт в Blobstore, который связывается с объектом в Datastore, затем в случае успех производится переход на ‘/’.
  • При обращении к ‘/delete/’ из URL извлекается номер объекта, после чего тот удаляется.
  • При обращении к ‘/get/’ из URL также извлекается номер объекта, после чего файл связанный с ним отправляется на загрузку.


Для проверки работы приложения, запустите отладочный сервер в консоли:

python google_appengine/dev_appserver.py <папка с вашим приложением>

Если хотите, чтобы сервер был доступен по сети, добавьте параметр --address 0.0.0.0 после dev_appserver.py.

Если никаких проблем не возникло, можно приступить к загрузке приложения:

python google_appengine/appcfg.py update <папка с вашим приложением>

Далее у вас спросят логин и пароль к учетной записи в Google, после чего приложение загрузится и будет доступно по адресу appid.appspot.com, где appid — это ваш уникальный идентификатор.
Исходные коды приложения на code.google.com (для использования достаточно просто отредактировать файл app.yaml): http://code.google.com/p/fileshare-appengine/

Преимущества перед существующими файлообменниками:


  • Не нужно смотреть рекламу, ждать минуту и т.п.
  • Файл можно скачать по прямой ссылке.
  • Очень высокая надежность.
  • Только вы управляете тем, что залито на ваш файлообменник. Его не закроют из-за другого пользователя
  • В указанных пределах использования ресурсов все бесплатно.
  • Если даже выделенных ресурсов мало, можно сделать еще одно приложение (это уже личные домыслы, в правилах конкретно на этот случай ничего нету, так что лучшу поузнавать. UPDATE: правилами это все-таки запрещено).
Непонятки:


  • Не совсем ясно насчет максимального размера файла — в русской документации написано 2 Гб, а в английской — 32 Мб.
  • Выяснилось, что русские имена файлов не поддерживаются. Пока не совсем понял, почему.


UPDATE: Если на этапе загрузки скрипта в Windows выдается ошибка вида UnicodeDecodeError, возможно поможет удаление всех ключей, в которых есть кириллица, из ветки реестра HKEY_CLASSES_ROOT/Mime/Database/ContentType

.

Счетчик тИЦ и PR Яндекс.Метрика Msn bot last visit powered by MyPagerank.NetYahoo bot last visit powered by MyPagerank.Net ping fast  my blog, website, or RSS feed for Free