Django app que pode fornecer amigável, múltiplos / massa funcionalidade de upload de arquivos para outros aplicativos

StackOverflow https://stackoverflow.com/questions/1627165

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu vou ser honesto: é uma pergunta que fiz no django-users mailinglist na semana passada. Desde que eu não tive quaisquer respostas ainda não, estou reposting-lo em Stack Overflow na esperança de que ele fica mais atenção aqui.

Eu quero criar um aplicativo que faz com que seja fácil de fazer user friendly, de upload de arquivos múltiplos / massa em seus próprios aplicativos. Com tomei amigável carregamento médio como Gmail, Flickr, ... onde o usuário pode selecionar múltiplos arquivos de uma vez na caixa de diálogo de navegação de arquivos. Os arquivos são enviados sequencialmente ou em paralelo e uma boa visão geral dos arquivos selecionados é mostrado na página com uma barra de progresso ao lado deles. A 'Cancelar' botão de upload também é uma opção possível.

Tudo o que niceness geralmente é resolvido usando um objeto Flash. Completo soluções estão lá fora, para o lado do cliente, como: SWFUpload http://swfupload.org/ , FancyUpload http://digitarald.de/project/fancyupload/ , YUI 2 Uploader http://developer.yahoo.com/yui/uploader/ e, provavelmente, muitos mais.

Claro que o truque é se essas soluções integradas em sua projeto. Especialmente em um quadro como Django, dobrar então se você quiser -lo para ser reutilizável.

Então, eu tenho algumas idéias, mas eu também não sou um especialista em Django nem sobre Piscar soluções de upload base. Eu vou compartilhar minhas idéias aqui na esperança de obter algum feedback de pessoas mais experientes e experientes. (Ou mesmo apenas alguns 'eu quero isso também!' Respostas :))

Você vai notar que eu fazer algumas suposições: isso é manter a (Inicial) âmbito da aplicação sob controle. essas premissas são, naturalmente, discutível:

Tudo bem, a minha ideia é até agora:

  • Se você deseja fazer o upload em massa de vários arquivos, você vai ter um modelar para conter cada arquivo. Ou seja o modelo irá conter um FileField ou um ImageField. Modelos com múltiplos (mas finito é claro) / quantidade de FileFields ImageFields não está na necessidade de fácil imho upload em massa: se você tem um Modelo com 100 FileFields você está fazendo algo errado :) Exemplos onde você iria querer minha imaginou tipo de carregamento em massa:

    • Um aplicativo que tem apenas um modelo 'Brochura' com um campo de arquivo, um campo de título (criado dinamicamente a partir do nome do arquivo) e uma DATE_ADDED campo.
    • A galeria de fotos aplicativo com modelos 'Gallery' e 'foto'. Você escolhe um Galeria para adicionar imagens para, carregar as imagens e novos objetos Foto são criados e chaves estrangeiras definido para a Galeria escolhido.
  • Seria bom para ser capaz de configurar ou expandir o app para o seu Flash favorito solução upload. Podemos escolher um dos três acima como um padrão, mas implementar o aplicativo para que as pessoas podem facilmente adicionar implementações adicionais (o tipo como Django pode usar múltiplos bases de dados). Que seja agnóstico a qualquer solução do lado do cliente particular.

  • Se nós precisa escolher um para começar, talvez escolher aquele com o menor pegada? (Menor de download de coisas do lado do cliente)

  • O flash soluções baseadas forma assíncrona (e quer sequencialmente ou em paralelo) pôr os arquivos para uma URL. Sugiro que url ser local a nossa aplicação genérica (por isso é o mesmo para todas as aplicações onde você usa o nosso app in). Isso url vai para uma visão fornecida pelo nosso aplicativo genérico.

  • A vista vai fazer o seguinte: criar uma nova instância do modelo, adicione o arquivo, opcionalmente fazer coisas extras e salve o exemplo.

  • DO EXTRA STUFF é o código que o aplicativo que usa o nosso app quer correr. Ele não tem de fornecer qualquer código extra, se o modelo tem apenas um FileField / ImageField o código de exibição padrão irá fazer o trabalho. Mas a maioria aplicativo vai querer fazer coisas extra que eu acho, como preenchendo os outros campos: título, DATE_ADDED, ForeignKeys, ManyToMany, ...

  • Eu não tenho yet pensou sobre um mecanismo para DO EXTRA STUFF. Somente envolvendo a visão aplicativo genérico veio à mente, mas isso não é desenvolvedor amigável, desde que você teria que escrever o seu próprio padrão de URL e seu vista próprio. Então você tem que dizer as soluções Flash para usar uma nova url etc ... Eu acho que algo como sinais podem ser usados ??aqui?

  • Formulários / Admin: Eu ainda estou muito superficial sobre como tudo isso poderia ser melhor integrados na administração ou genérico do Django formulários / widgets / ... (E este é eram minha falta de Django mostra a experiência):

    • No caso da aplicação Galeria / Foto: Você poderia fornecer a Photo widget de upload em massa no detalhe Gallery Formato. Mas e se a instância Gallery não é salvo ainda? O arquivo vista upload não será capaz de definir as ForeignKeys na fotografia instâncias. Vejo que o aplicativo auth, quando você cria um usuário, primeira pergunta o nome de usuário e senha e só então lhe proporciona um maior formulário para preencher emailadres, escolher papéis etc. Nós poderíamos fazer algo como isso.
    • No caso de um aplicativo com apenas um modelo: Como você fornecer um formulário no admin para fazer a sua massa Envio? Você não pode fazê-lo com a forma de seu modelo de detalhe, que de apenas por uma instância de modelo.

Há provavelmente dezenas mais perguntas que precisam ser respondidas antes Posso até começar neste aplicativo. Então, por favor me diga o que você pensa! Dar input me! Do que você gosta? O que não? O que você faria diferente? É Este sólido idéia? Onde não é?

Obrigado!

Foi útil?

Solução

Eu só lançou um aplicativo simples para isso cerca de um mês atrás:. django-uploadify

É basicamente uma tag template Django que atua como um wrapper para o muito bacana Uploadify (requer jQuery). Usá-lo é tão simples como adicionar isso ao seu template ...

{% load uploadify_tags }{% multi_file_upload ‘/upload/complete/url/’ %}

O tag vai disparar eventos (1 por arquivo) em ambos os lado do cliente e do lado do servidor (sinal Django) para indicar quando um arquivo foi recebida.

Por exemplo, supondo que você tem um modelo de 'Media' que lida com todos os arquivos enviados por usuários ...

def upload_received_handler(sender, data, **kwargs):
    if file:
        new_media = Media.objects.create(
            file = data,
            new_upload = True,
        )
        new_media.save()

upload_recieved.connect(upload_received_handler, dispatch_uid=‘whatever.upload_received’)

Confira o wiki para obter informações sobre como configurá-lo e criar o sinal manipuladores (cliente / servidor).


Sobre sua implementação conceitual de cima, a seguir, alguns pontos de consideração:

  • Tendo o aplicativo automaticamente criar a instância "Arquivo Modelo" provavelmente não é tão robusto como as pessoas já podem ter seus próprios modelos que estão trabalhando com
  • Se você quiser implementar qualquer tipo de segurança ou de autenticação, você precisa de um sistema aberto e menos de um tipo de 'auto-criar'
  • Eu realmente acho sinais / eventos são a maneira de lidar com isso, e também lidar com parte do 'fazer outras coisas' do que você mencionou.
  • A minha conclusão foi que multi-carregamento pode nunca ser realmente um widget de formulário no sentido de que implementos Django formar widgets. 1 arquivo provavelmente será representado por uma instância do modelo (com algumas exceções), o que significa que vamos acabar com uma situação onde um widget pode representar N instâncias do modelo. No entanto Django está configurado de modo que um widget representa um valor para o campo de 1 em 1 instância. Ele simplesmente não se encaixa para a maioria dos casos de uso para tê-lo como um widget (daí porque eu fui a rota tag).
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top