【问题标题】:Django-filer get absolute URL and Django Celery UploadDjango-filer 获取绝对 URL 和 Django Celery Upload
【发布时间】:2014-10-27 10:32:40
【问题描述】:

是否可以获取刚刚使用 Django Filer 上传的文件的绝对 URL?

我的问题是这样的:

我正在使用 Django Filer 上传音乐。然后我想将此文件提交给 Django Celery 以使用他们的 API 上传到 Mixcloud。但是..

我不知道如何获取文件的 URL。我没有使用视图,我只想使用管理员,获取刚刚上传的文件并发送到 Celery 以使用他们的 API 上传到 Mixcloud。但我只能将模型中的对象导入芹菜。

我的模特:

class MixcloudUpload(models.Model):
    files = FilerFileField(null=True, blank=True)
    data = {'name': 'API Test'}


    def save(self, *args, **kwargs):

        super(MixcloudUpload, self).save(*args, **kwargs)
        from .tasks import uploadtask
        uploadtask.delay(self.id)

我的任务:

@celery_app.task()
def uploadtask(request):
    sleep(5)
    # Update the state. The meta data is available in task.info dicttionary
    # The meta data is useful to store relevant information to the task
    # Here we are storing the upload progress in the meta.
    post_url = 'https://api.mixcloud.com/upload/?access_token=ugY'
    from .models import MixcloudUpload
    mp3 = MixcloudUpload.files
    data = MixcloudUpload.data
    files = ({'mp3': open(mp3)})
    headers = {'enctype': 'multipart/form-data'}
    r = requests.post(post_url, headers=headers, files=files, data=data, verify=True)
    return r, r.json(), request

【问题讨论】:

    标签: python django django-celery django-filer


    【解决方案1】:

    Django Filer 在上传时设置uploaded_at(日期时间字段)模型属性。您可以对此进行过滤以获取新的上传以转发到 Mixcloud。

    至于获取绝对网址。文件管理器文档在这方面有点棘手。但是您可以使用两个属性:

    • File.objects.all()[0].path,是文件系统上文件的路径。
    • File.objects.all()[0].url,域名后的url路径,例如:/media/filer_public/23/23/34565b67-e1de-41da-3132-1403c335fdd4/test_img.png/。您需要自己添加域。所以完整路径类似于:"http" + urlencode(site_obj.domain) + filer_obj.url

    【讨论】:

    • 这是正确的方法吗? mp3 = MixcloudUpload.files.objects.all()[0].path 当我尝试这个时,我得到对象没有属性'objects'
    • 示例File.objects.all()[0] 只是为了让您可以尝试一下。我知道您的模型名为 MixcloudUpload 并且可能包含 FilerFileField?您可能希望按MixcloudUpload.objects.filter(filefield__uploaded_at__gt=last_celery) 进行过滤,其中last_celery 是一个日期时间对象,filefield 是FilerFileField 的名称。对于这些对象中的每一个,您都可以获得路径。
    • 谢谢,我刚刚更新了帖子,这样你就可以更清楚地看到我想要实现的目标
    • 感谢您迄今为止的帮助。当我尝试得到TypeError: coercing to Unicode: need string or buffer, QuerySet found 时,我使用“文件”作为字段,使用“现在”作为日期时间对象,我不确定这是否正确
    • 我没有使用过 Celery。但似乎uploadtask 函数中的request 参数实际上是MixcloudUpload 实例的ID。要获取文件的路径,您将执行MixcloudUpload.objects.get(id=request).files.path。但是,如果是这种情况,重命名 request 变量是个好主意。
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2014-07-18
    • 2012-05-06
    • 1970-01-01
    • 2015-06-26
    • 2020-01-11
    相关资源
    最近更新 更多