8
votes

Méthode de téléchargement alternatif pour Django Filefield

J'ai des modèles Django qui utilisent un champfinield et les utilisateurs ont téléchargé des fichiers dans l'interface d'administration. Nous avons maintenant un problème que certains fichiers sont assez gros (1-3g), ce qui rend HTTP télécharger délicat.

Il existe une classe "conteneur", puis "Fichier" classes avec un FK sur le conteneur. J'ai utilisé des inlices dans l'interface graphique d'administration pour faciliter la tâche des utilisateurs (formulaire de classe de conteneurs, avec des inlines de classe de fichiers)

J'ai trouvé FilePathfield, que je suppose qu'il sera utile de laisser les utilisateurs SCP / RSYNC des fichiers sur le serveur, puis de la naviguer et de les ajouter de les détails, mais comment puis-je l'obtenir dans l'administrateur? Dois-je simplement construire une nouvelle forme / une nouvelle vue qui crée les objets? Existe-t-il un moyen d'alléger le modèle dans un formulaire d'administrateur personnalisé (et de conserver ainsi toute la bonté d'administration gratuite), qui remplace FilePathfield avec FilePathfield? Toute autre suggestion?

Merci pour toute suggestion!


3 commentaires

Curieux de voir quelle est la réponse, j'ai besoin de traiter ce même problème, de nombreux fichiers de 100-200 Mo, téléchargés via admin vers S3.


J'ai fait un formulaire avec FilePathfield qui fonctionne OK-ISH, mais a besoin d'un rechargement du serveur Web pour voir de nouveaux fichiers: / - Vous recherchez toujours des alternatives!


Comment puis-je scp un fichier qui est entré ensuite dans le DB Automatique comme instance de modèle? Le modèle et fichierfield attr. exister. Est tissu nécessaire?


3 Réponses :


0
votes

Je ne sais pas si j'ai bien compris ce que vous voulez inclure dans la zone d'administration. Cherchez-vous un moyen d'automatiser le processus de téléchargement de fichier avec un protocole de transfert autre que http?

Si tel est le cas, vous pouvez créer un modèle avec un charfield de base (ou peut-être un URLFIELD), puis effectuez une copie RSYNC ou SCP lorsque L'objet est enregistré. Par exemple: P>

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


0 commentaires

0
votes

Je ne suis pas un expert dans le transfert d'énormes fichiers, mais si vos utilisateurs doivent pouvoir faire cela sans "incantations UNIX", je suggère de regarder dans la création d'une applet Java pour cela. Ce serait beaucoup de travail, mais vous pourriez alors avoir une bonne barre de progression, etc.


0 commentaires

2
votes

Vous mentionnez que filePathfield fonctionne, mais doit avoir le serveur Web redémarré pour voir de nouveaux fichiers. Cela se produit car les options sont rassemblées filepathfield .__ init __ , appelé une fois lorsque le module est importé.

Un correctif serait de rappeler le champ __ init __ dans le formulaire __ init __ : xxx

(que La manière dont le répertoire est numérisé chaque fois que le formulaire est instancié.)


0 commentaires