我正在开展一个项目,用户可以通过表单提交指向其他网站上托管的声音文件的链接。我想将该文件下载到我的服务器并使其可用于流式传输。我可能需要将其上传到Amazon S3。我在Django做这个,但我是Python的新手。任何人都可以指出我正确的方向如何做到这一点?
答案 0 :(得分:0)
我将如何做到这一点:
创建像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)
接下来创建一个带有ModelForm
的视图,并将信息保存到数据库中。
在SoundUpload
模型上追加post-save signal django-celery Task。这将确保UI在您处理所有数据时做出响应。
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)
在ProcessSoundUploadTask
任务中,您需要:
这种方法的关键是使用django-celery
。一旦任务通过post_save信号启动,UI就可以返回,从而创建一个非常“活泼”的体验。此任务放在AMQP消息队列中,可以由多个工作人员(专用EC2实例等)处理,因此您可以毫不费力地扩展。这看起来有点矫枉过正,但实际上并没有看起来那么多。