2009-08-11 8 views
8

Mam kilka modeli django, które używają FileField, a użytkownicy ładują pliki w interfejsie administratora. Mamy teraz problem, że niektóre pliki są dość duże (1-3G), co sprawia, że ​​przesyłanie http jest trudne.Alternatywna metoda przesyłania dla Django FileField

Istnieje klasa "container", a następnie "file" klasy z FK do kontenera. Użyłem inlines w gui admin, aby ułatwić to użytkownikom (formularz klasy kontenera, z liniami inline plików)

Znalazłem FilePathField, co, jak sądzę, będzie użyteczne, aby umożliwić użytkownikom plików scp/rsync do serwer, a następnie przeglądaj i dodawaj do nich szczegóły, ale jak mogę to zrobić w administratorze? Czy muszę po prostu zbudować nowy formularz/widok, który tworzy obiekty? Czy istnieje jakiś sposób, aby jakoś nadpisać model w niestandardowym formularzu administratora (a tym samym zachować pełną dobroć administratora), który zastępuje pole plików polem plików? Jakieś inne sugestie?

Dzięki za wszelkie sugestie!

+1

ciekawy zobaczyć co Odpowiedź brzmi, muszę zająć się tym samym problemem wkrótce - wiele plików od 100-200mb, przesłane przez administratora do S3. –

+0

Zrobiłem formularz z FilePathField, który działa poprawnie, ale wymaga przeładowania serwera, aby zobaczyć nowe pliki:/- wciąż szuka alternatyw! – user130924

Odpowiedz

0

Nie jestem pewien, czy rozumiem, co chcesz uwzględnić w obszarze administracyjnym. Szukasz sposobu na zautomatyzowanie procesu przesyłania plików za pomocą protokołu transferu innego niż HTTP?

Jeśli tak, możesz utworzyć model z podstawową CharField (lub może URLField), a następnie wykonać kopię rsync lub scp, gdy obiekt zostanie zapisany. Na przykład:

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 

Jest to bardzo szorstki przykład, ale powinien pomóc w zrozumieniu czegoś. Będziesz musiał upewnić się, że twoja procedura jest bezpieczna (źle skonstruowane ścieżki mogą pozwolić użytkownikowi na uruchomienie czegokolwiek, na przykład). Ponadto, to prawdopodobnie zablokuje procedurę składowania Django podczas kopiowania pliku, więc powinieneś sprawdzić uruchamianie preferowanego polecenia w oddzielnym procesie.

Powodzenia!

0

Nie jestem ekspertem w przenoszeniu ogromnych plików, ale jeśli użytkownicy muszą mieć możliwość wykonywania tego bez "zaklęć UNIX", sugerowałbym stworzenie dla niego apletu Java. To by było dużo pracy, ale wtedy mógłbyś mieć odpowiedni pasek postępu itp.

2

Wspomniałeś, że FilePathField działa, ale musi mieć ponownie uruchomiony serwer WWW, aby zobaczyć nowe pliki. Dzieje się tak dlatego, że opcje są gromadzone FilePathField.__init__, które nazywają się po po zaimportowaniu modułu.

fix byłoby ponownie wywołać pole na __init__ w formie na __init__:

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

(W ten sposób katalog jest skanowany za każdym razem, gdy forma jest instancja).

Powiązane problemy