Альтернативный метод загрузки для Django FileField - PullRequest
8 голосов
/ 11 августа 2009

У меня есть некоторые модели django, которые используют FileField, и пользователи загружают файлы в интерфейсе администратора. Теперь у нас проблема с тем, что некоторые файлы довольно большие (1-3G), что затрудняет загрузку http.

Существует класс «контейнер», а затем «файловые» классы с FK для контейнера. Я использовал встроенные функции в интерфейсе администратора, чтобы упростить эту задачу для пользователей (форма класса контейнера, со встроенными классами файлов)

Я обнаружил FilePathField, который, я думаю, будет полезен для того, чтобы пользователи могли просматривать файлы scp / rsync на сервере, а затем просматривать и добавлять к ним подробную информацию, но как я могу получить это у администратора? Нужно ли мне просто создать новую форму / представление, которое создает объекты? Есть ли способ каким-либо образом переопределить модель в пользовательской форме администратора (и, таким образом, сохранить все возможности бесплатного администратора), которая заменяет filefield на filepathfield? Любые другие предложения?

Спасибо за любые предложения!

Ответы [ 3 ]

2 голосов
/ 26 августа 2009

Вы упоминаете, что FilePathField работает, но необходимо перезапустить веб-сервер, чтобы увидеть новые файлы. Это происходит потому, что параметры собираются FilePathField.__init__, который называется один раз при импорте модуля.

Исправление будет состоять в том, чтобы повторно вызвать __init__ поля в форме __init__:

def __init__(self, **kwargs):
    super(MyForm, self).__init__(**kwargs)
    self.fields['file'].__init__(path)

(Таким образом, каталог сканируется каждый раз, когда создается экземпляр формы.)

0 голосов
/ 25 августа 2009

Я не специалист по передаче огромных файлов, но если ваши пользователи должны иметь возможность делать это без «заклинаний UNIX», я бы посоветовал заняться созданием для этого Java-апплета. Это было бы много работы, но тогда вы могли бы иметь надлежащую индикатор выполнения и т. Д.

0 голосов
/ 25 августа 2009

Я не уверен, понял ли я, что вы хотите включить в админку. Вы ищете способ автоматизации процесса загрузки файлов с протоколом передачи, отличным от HTTP?

Если это так, вы можете создать модель с базовым CharField (или, может быть, URLField), а затем выполнить rsync или scp копию при сохранении объекта. Например:

from django.db import models

class File(models.Model):
   path = models.CharField()
   def save(self):
      import os
      # WARNING! The path given by the user should be sanitized; this is
      # example code only. This is a security vulnerability.

      # Attempt to rsync the target file from a remote machine
      exit_code = os.system("rsync %s /incoming/files/path/" % self.path)
      # Make sure it worked before saving
      if exit_code == 0:
         super(File, self).save() # Call the "real" save() method
      else:
         # Raise exception

Это очень грубый пример, но он должен помочь вам разобраться. Вам нужно будет убедиться, что ваша подпрограмма безопасна (неправильно сформированные пути могут позволить пользователю запускать что угодно, например). Кроме того, это, скорее всего, заблокирует подпрограмму сохранения Django при копировании в файл , поэтому вам следует посмотреть на выполнение предпочитаемой вами команды в отдельном процессе.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...