Django - Download de arquivos para autenticados

379 views
Skip to first unread message

Gilnei Atuanet

unread,
Jun 27, 2016, 9:49:56 PM6/27/16
to Django Brasil
Ola! 
Estou desenvolvendo um pequeno sistema para bakups e cheguei numa incognita.. Qual a melhor maneira de disponibilizar o download do arquivo de backup usando o Django?
Obviamente preciso que somente autorizados tenham acesso aos arquivos. Quando eu salvo o arquivo de backups, eu armazeno no banco o diretorio que ele esta.. Alguem ja fez algo assim? Alguma luz? 
Agradeco desde ja!
Att Gilnei

André Luiz

unread,
Jun 28, 2016, 1:02:41 AM6/28/16
to django...@googlegroups.com
Consigo divagar sobre  algumas forma de fazer isso.



A mais simples é salvar o arquivo num diretório que não é acessível pelo servidor web e fazer o Django ler o arquivo e redirecionando o output para uma view.


A meu ver essa é uma solução ruim em questão de performance mas funciona muito bem pra maioria dos casos.



A mais correta (e complexa) pra mim seria usar um sistema baseado em signed url ou cookie geralmente contendo o IP do usuário e um timestamp para autorizar o acesso do usuário ao arquivo


Caso queira fazer manualmente você vai precisar de uma forma do seu servidor web validar a chave gerada pelo Django, dica o Nginx aceita scripts Lua, quase fiz isso uma vez mas terceirizei pra Amazon.


--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Gileno Filho

unread,
Jun 28, 2016, 6:36:02 AM6/28/16
to django...@googlegroups.com
Olá Gilnei, vai depender um pouco de como está sua infraestrutura dos arquivos estáticos.

Se tiver utilizando algum serviço customizado como Amazon S3, normalmente esses serviços já tem uma solução de url assinada e seria preciso apenas ativar e entender como funciona.

Caso tenha um VPS comum, ai depende se utiliza nginx ou apache2 como servidor para os arquivos estáticos.

Apache2: No apache existe uma opção chamada mod_xsendfile, nele é possível indicar um diretório de arquivos estáticos que não está visível mas que na hora de retornar a requisição através do django para o apache retornar o usuário você pode indicar num cabeçalho "XSendFile" e então o apache irá ignorar a resposta do django e servir o arquivo.

Nginx: O Nginx tem algo parecido mas com nome diferente, X-Accel. A ideia é a mesma do apache: 

Como fazer? Simples, faça uma view django normal que verifique se o usuário tem acesso a um determinado arquivo (provavelmente um model com filefield?), e então na hora de responder ao usuário a resposta http vai vazia apenas preenchida com o cabeçalho adequado e o nginx e apache irá fazer o restante. O legal disso é que o django não fica responsável por servir o arquivo estático.

Obs: Tudo isso é considerando o fato de você está trabalhando com apache ou nginx como um proxy reverso para a tua aplicação django através do padrão WSGI.


--

Fabio C. Barrionuevo da Luz

unread,
Jun 28, 2016, 7:18:48 AM6/28/16
to django...@googlegroups.com

Para utilizar o X-Accel com django, talvez o:

https://github.com/benoitbryon/django-downloadview

possa te ajudar. (Embora eu nunca precisei usar)

-- 

Fábio C. Barrionuevo da Luz
Palmas - Tocantins - Brasil - América do Sul

http://pythonclub.com.br/

Blog colaborativo sobre Python e tecnologias Relacionadas, mantido totalmente no https://github.com/pythonclub/pythonclub.github.io .

Todos são livres para publicar. É só fazer fork, escrever sua postagem e mandar o pull-request. Leia mais sobre como publicar em README.md e contributing.md.

Regra básica de postagem:

"Você" acha interessante? É útil para "você"? Pode ser utilizado com Python ou é útil para quem usa Python? Está esperando o que? Publica logo, que estou louco para ler...

Reply all
Reply to author
Forward
0 new messages