Наверняка каждый из вас в своей жизни находил удобный для себя файловый
Довольно интересной находкой оказался 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/