Как мне загрузить файл с отправленной ссылки и затем загрузить его на сервер для потоковой передачи? - PullRequest
1 голос
/ 11 сентября 2010

Я работаю над проектом, где пользователь может отправить ссылку на звуковой файл, размещенный на другом сайте, через форму Я хотел бы загрузить этот файл на свой сервер и сделать его доступным для потоковой передачи. Возможно, мне придется загрузить его на Amazon S3. Я делаю это в Django, но я новичок в Python. Кто-нибудь может указать мне правильное направление, как это сделать?

1 Ответ

0 голосов
/ 11 сентября 2010

Вот как бы я это сделал:

  1. Создать модель типа SoundUpload, например:

    class SoundUpload(models.Model):
        STATUS_CHOICES = (
            (0, 'Unprocessed'),
            (1, 'Ready'),
            (2, 'Bad File'),
        )
        uploaded_by = models.ForeignKey(User)
        original_url = models.URLField(verify_true=False)
        download_url = models.URLField(null=True, blank=True)
        status = models.IntegerField(choices=STATUS_CHOICES, default=0)
    
  2. Затем создайте представление без ModelForm и сохраните информацию в базе данных.

  3. Подключите сигнал после сохранения на модели SoundUpload, который пинает джанго-сельдерей Задание . Это гарантирует, что пользовательский интерфейс отвечает, пока вы обрабатываете все данные.

    def process_new_sound_upload(sender, **kwargs):
       # Bury to prevent circular dependency issues.
       from your_project.tasks import ProcessSoundUploadTask
       if kwargs.get('created', False):
            instance = kwargs.get('instance')
            ProcessSoundUploadTask.delay(instance.id)
    
    post_save.connect(process_new_sound_upload, sender=SoundUpload)
    
  4. В задании ProcessSoundUploadTask вы захотите:

    • Поиск объекта модели на основе переданного идентификатора.
    • Использование pycurl загрузка файла во временную папку (с очень ограниченными разрешениями).
    • Используйте ffmpeg (или аналогичный), чтобы убедиться, что это настоящий звуковой файл. Выполните любые другие проверки на вирусы (зависит от того, насколько вы доверяете своим пользователям) Если файл окажется плохим, установите в поле SoundUpload .status значение 2 (Bad File), сохраните его и вернитесь, чтобы остановить обработку задачи. Возможно, отправьте письмо здесь.

    • Используйте boto для загрузки файла в s3. См. этот пример.

    • Обновите SoundUpload .download_url, указав URL-адрес s3, статус для обработки и сохраните объект.
    • Выполнить любую другую постобработку (отправка уведомлений по электронной почте и т. Д.)

Ключом к этому подходу является использование django-celery. Когда задание запускается с помощью сигнала post_save, пользовательский интерфейс может вернуться, создавая, таким образом, очень «быстрый» опыт. Эта задача помещается в очередь сообщений AMQP , которая может обрабатываться несколькими работниками (выделенными экземплярами EC2 и т. Д.), Поэтому вы сможете масштабировать без особых проблем. Это может показаться излишним, но на самом деле это не так много, как кажется.

...