Django-filer получает абсолютный URL и загружает Django Celery

Можно ли получить абсолютный URL-адрес файла, только что загруженного с помощью Django Filer?

Моя проблема в следующем:

Я использую Django Filer для загрузки музыки. Затем я хочу отправить этот файл в Django Celery для загрузки в Mixcloud с помощью их API. Но..

Я не могу понять, как получить URL-адрес файла. Я не использую представления, я хочу просто использовать администратора, захватить только что загруженный файл и отправить в Celery для загрузки в Mixcloud с помощью их API. Но я могу импортировать объект только из модели в сельдерей.

Моя модель:

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

person phyichai    schedule 27.10.2014    source источник


Ответы (1)


Django Filer устанавливает атрибут модели uploaded_at (поле даты и времени) при загрузке. Вы можете отфильтровать это, чтобы получать новые загрузки для пересылки в Mixcloud.

Что касается получения абсолютного URL-адреса. Документация по файловому серверу в этом отношении немного сложна. Но есть два атрибута, которые вы можете использовать:

  • 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.
person rrmoelker    schedule 27.10.2014
comment
Это правильный способ? mp3 = MixcloudUpload.files.objects.all () [0] .path Когда я пробую это, я получаю, что у объекта нет атрибута 'objects' - person phyichai; 27.10.2014
comment
Пример File.objects.all()[0] предназначен для того, чтобы вы могли попробовать. Я так понимаю, ваша модель называется MixcloudUpload и, вероятно, содержит FilerFileField? Вероятно, вы захотите выполнить фильтрацию по MixcloudUpload.objects.filter(filefield__uploaded_at__gt=last_celery), где last_celery - это объект datetime, а filefield - имя FilerFileField. Для каждого из этих объектов вы можете получить путь. - person rrmoelker; 27.10.2014
comment
Спасибо, я только что обновил пост, чтобы вы могли более четко увидеть, чего я пытаюсь достичь - person phyichai; 27.10.2014
comment
Спасибо за вашу помощь. Когда я пытаюсь это сделать, я получаю TypeError: coercing to Unicode: need string or buffer, QuerySet found, я использовал «файлы» в качестве поля и «сейчас» в качестве объекта Datetime, я не уверен, правильно ли это - person phyichai; 27.10.2014
comment
Я не работал с сельдереем. Но похоже, что параметр request в вашей uploadtask функции на самом деле является идентификатором MixcloudUpload экземпляра. Чтобы получить путь к файлу, выполните MixcloudUpload.objects.get(id=request).files.path. Однако переименование переменной request - хорошая идея, если это так. - person rrmoelker; 27.10.2014