2009-08-11 14 views
8

Tengo algunos modelos django que usan un FileField, y los usuarios han estado cargando archivos en la interfaz de administración. Ahora tenemos el problema de que algunos archivos son bastante grandes (1-3G), lo que dificulta la carga de http.Método de carga alternativo para Django FileField

Hay una clase "contenedor", y luego clases "file" con un FK en el contenedor. He utilizado inlines en la interfaz gráfica de administración para hacer esto más fácil para los usuarios (formulario de clase de contenedor, con inlines clase de archivos)

he encontrado FilePathField, que supongo que será útil para que los usuarios scp archivos/rsync a la servidor y luego buscar y agregar detalles, pero ¿cómo puedo obtener esto en el administrador? ¿Necesito simplemente construir una nueva forma/vista que cree los objetos? ¿Hay alguna manera de anular de alguna manera el modelo en un formulario de administración personalizada (y así mantener todo el valor de administración gratuita), que reemplaza el campo de archivos con el campo de ruta de archivo? ¿Cualquier otra sugerencia?

¡Gracias por cualquier sugerencia!

+1

curiosidad por ver lo que el La respuesta es que necesito lidiar pronto con este mismo problema: muchos archivos de 100-200 mb, cargados vía admin a S3. –

+0

He creado un formulario con FilePathField que funciona bien, pero necesita una recarga del servidor web para ver nuevos archivos:/- ¡todavía estoy buscando alternativas! – user130924

Respuesta

0

No estoy seguro de haber entendido lo que desea incluir en el área de administración. ¿Está buscando una forma de automatizar el proceso de carga de archivos con un protocolo de transferencia que no sea HTTP?

Si es así, podría crear un modelo con un CharField básico (o tal vez un campo URLField), y luego realizar una copia rsync o scp cuando se guarde el objeto. Por ejemplo:

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 

Este es un ejemplo muy aproximado, pero debería ayudarlo a resolver algo. Tendrá que llamar al para asegurarse de que su rutina sea segura (las rutas mal formadas podrían permitirle al usuario ejecutar lo que quiera, por ejemplo). Además, esto probablemente bloqueará la rutina de guardado de Django mientras se copia sobre un archivo, por lo que debería considerar ejecutar su comando preferido en un proceso separado.

¡Buena suerte!

0

No soy un experto en la transferencia de archivos de gran tamaño, pero si tus usuarios necesitan hacerlo sin "hechizos de UNIX", sugeriría que busques crear un applet de Java para él. Sería mucho trabajo, pero luego podría tener una barra de progreso adecuada, etc.

2

Menciona que FilePathField funciona, pero necesita reiniciar el servidor web para ver los archivos nuevos. Esto sucede porque las opciones se recopilan FilePathField.__init__, que se llama una vez cuando se importa el módulo.

Una solución sería la de volver a llamar de __init__ en el campo de la forma __init__:

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

(De esa manera el directorio se escanea cada vez que se instancia el formulario.)

Cuestiones relacionadas