Skip to content

Commit 351559e

Browse files
committed
Merge pull request pythonclub#166 from dyesten/pelican
Integrando Django com Cloudinary por @dyesten
2 parents 5bc289a + c08cd74 commit 351559e

3 files changed

Lines changed: 219 additions & 0 deletions

File tree

34.9 KB
Loading
3.65 KB
Loading
Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
Title: Integrando o Django com Cloudinary
2+
Date: 2014-12-09 23:08
3+
Tags: Django, Cloudinary, Heroku
4+
Category: deploy-infraestrutura
5+
Slug: integrando-django-com-cloudinary
6+
Author: Dyesten Paulon
7+
Email: dyesten.pt@gmail.com
8+
Github: dyesten
9+
Facebook: dyesten.paulon
10+
Category: Cloudinary
11+
12+
13+
### O que é?
14+
15+
O Cloudinary é um serviço de gerenciamento de imagens e arquivos na nuvem, muito útil por exemplo para utilização junto ao Heroku, que não oferece o serviço de hospedagem de arquivos. Além de nos oferecer o serviço de hospedagem de imagens, o Cloudinary disponibiliza diversas manipulações, uso de efeitos, detecção facial e muitos outros recursos para as imagens enviadas.
16+
17+
### O que é preciso?
18+
19+
Para iniciarmos é preciso se __cadastrar__ no site. O cadstro pode ser feito com uma conta gratuita limitada.
20+
21+
[Cadastro Gratuito](https://cloudinary.com/users/register/free)
22+
23+
<br>
24+
Ao finalizar o cadastro, uma tela como a exibida abaixo estará disponível. Atenção nos itens Cloud name, API Key e API Secret, eles serão úteis mais adiante.
25+
26+
![Cadastro Cloudinary](/images/dyesten/cadastro_cloudinary.png)
27+
28+
<br>
29+
30+
### Configurando o ambiente
31+
32+
A instação do pacote pode ser feita via __pip__:
33+
34+
pip install cloudinary
35+
36+
Ou baixando o pacote pelo [link](https://pypi.python.org/pypi/cloudinary/1.0.18)
37+
38+
39+
### Configurando o settings
40+
<small>_Obs.: focaremos apenas nas configurações do cloudinary._</small>
41+
42+
Primeiramente no INSTALLED_APPS incluiremos a linha __'cloudinary'__ e a linha com nossa app:
43+
44+
INSTALLED_APPS = (
45+
'django.contrib.admin',
46+
'django.contrib.auth',
47+
'django.contrib.contenttypes',
48+
'django.contrib.sessions',
49+
'django.contrib.messages',
50+
'django.contrib.staticfiles',
51+
'cloudinary',
52+
'cloudinary_example.core',
53+
)
54+
55+
Ainda no settings adicione ao seu arquivo os parâmetros de configuração do Cloudinary:
56+
57+
<small>_Obs.: estes parâmetros são os mesmo da imagem inicial. E os abaixo apresentados são apenas ficticios_</small>
58+
59+
CLOUDINARY = {
60+
'cloud_name' : seu_app_cloud,
61+
'api_key' : '00998877665544',
62+
'api_secret': 'DBseuAPPAKI-mtb7ZklCCBuJNoNetp'
63+
}
64+
65+
### Models
66+
67+
Faremos a importação do Cloudinary e em seguida definiremos nossa classe __'Imagens'__:
68+
69+
from django.db import models
70+
from cloudinary.models import CloudinaryField
71+
72+
class Imagens(models.Model):
73+
imagem = CloudinaryField('imagem')
74+
75+
<small>_Obs.: execute o syncdb. No caso de utilização do South, acresencete o seguinte código:_</small>
76+
77+
from south.modelsinspector import add_introspection_rules
78+
add_introspection_rules([], ["^cloudinary\.models\.CloudinaryField"])
79+
80+
### Forms
81+
Agora vamos importar o modelo em nosso __forms__, e definiremos nossa Classe em seguida:
82+
83+
from django import forms
84+
from cloudinary_example.core.models import Imagens
85+
86+
class ImagensForm(forms.ModelForm):
87+
class Meta:
88+
model = Imagens
89+
90+
91+
Agora vamos criar o formulário para fazermos o upload das imagens.
92+
Antes vamos definir uma rota para nossa __views__, chamaremos ela de _'galeria'_:
93+
94+
urlpatterns = patterns('cloudinary_example.core.views',
95+
url(r'^galeria/$', 'galeria', name='galeria'),
96+
)
97+
98+
Criaremos agora uma __views__ mais simples possível para chegar até nosso __template__:
99+
100+
from django.shortcuts import render_to_response
101+
from cloudinary_example.core.forms import ImagensForm
102+
103+
def galeria(request):
104+
return render_to_response('galeria.html', {'form':ImagensForm})
105+
106+
107+
Agora vamos criar nosso template _'galeria.html'_ com o seguinte código:
108+
109+
{% extends 'base.html' %}
110+
{% load cloudinary %}
111+
112+
{% block content %}
113+
<form action="." method="post" enctype="multipart/form-data">
114+
{% csrf_token %}
115+
<table border=1 align="center">
116+
<tr>
117+
<td style="padding:10px;margin:20px;">
118+
<label for="imagens">Imagens:</label>
119+
</td>
120+
121+
<td style="padding:10px;margin:20px;">
122+
{{ form.imagem }}
123+
</td>
124+
</tr>
125+
126+
<tr align="center">
127+
<td colspan='2' style="padding:10px;margin:20px;">
128+
<input type="submit" value="Upload">
129+
</td>
130+
</tr>
131+
</table>
132+
{% endblock content%}
133+
134+
![Template Inicial](/images/dyesten/template_inicial.png)
135+
136+
137+
Legal mas nossa _views_ ainda não tem a ação para salvar a imagem no Cloudinary, agora vamos voltar e realizar a ação para salvar a imagem.
138+
Primeiro vamos incluir as importações do nosso model.
139+
140+
from cloudinary_example.core.models import Imagens
141+
142+
Vamos alterar nosso método _'galeria'_ para o seguinte:
143+
144+
from django.shortcuts import render
145+
from cloudinary_example.core.forms import ImagensForm
146+
from cloudinary_example.core.models import Imagens
147+
148+
def galeria(request):
149+
if request.method == 'POST':
150+
form = ImagensForm(request.POST, request.FILES)
151+
if form.is_valid():
152+
form.save()
153+
154+
return render(request, 'galeria.html', {'form':ImagensForm})
155+
156+
157+
Ok, agora nossa imagem já pode ser salva no Cloudinary e nosso banco de dados. E como recuperar as imagens para exibição?
158+
Neste exemplo vamos utilizar as mesma _views_ e o mesmo _template_ para exibição. Para isso vamos alterar nossa _views_ para buscar os id’s de nossas imagens salvos no banco,
159+
altere o seu return para o seguinte:
160+
161+
return render(request, 'galeria.html', {'form':ImagensForm, 'imgs':Imagens.objects.all()})
162+
163+
Já em seu template, adicione o seguinte código:
164+
165+
<table align="center">
166+
{% for img in imgs %}
167+
<tr>
168+
<td>{% cloudinary img.imagem %}</td>
169+
</tr>
170+
{% empty %}
171+
<tr>
172+
<td>Sem Itens na Lista</td>
173+
</tr>
174+
{% endfor %}
175+
</table>
176+
177+
Com apenas este código acima, é possível buscarmos as imagens assim que carregadas.
178+
179+
Alguns detalhes importantes:
180+
181+
* A tag {% cloudinary img.imagem %} é equivalente a uma tag html <img>:
182+
183+
<small><_img src="http://res.cloudinary.com/suapasta/image/upload/v001122334455/codigodasuaimagem.jpg"></small>
184+
185+
* Se é uma tag HTML, podemos utiliza-la sempre assim? A resposta é utilize a que se sentir mais confortável, não há qualquer problema.
186+
* Alguns parâmetros podem ser adicionados a sua tag, como por exemplo, height, width, crop e muitos outros:
187+
188+
{% cloudinary img.imagem height=500 width=400 crop="fill" %}
189+
190+
Consulte a [documentação](http://cloudinary.com/documentation/django_image_manipulation) para mais exemplos de manipulação.
191+
192+
193+
### Extra
194+
195+
E como carregar múltiplos arquivos? O Django e Cloudinary te dão suporte total a essa ação de forma simples.
196+
197+
Vamos começar alterando nosso __forms__. Primeiro adicionaremos a importação da biblioteca do Cloudinary:
198+
199+
from cloudinary.forms import CloudinaryJsFileField
200+
201+
202+
Em seguida, incluiremos após a class meta a linha que indica que nosso campo file input deve ser multiple:
203+
204+
imagem = CloudinaryJsFileField( attrs={'multiple': 1, 'name':'imagens'} )
205+
206+
207+
E nossa view sofre uma pequena alteração para percorrer os itens do request Files:
208+
209+
def galeria(request):
210+
if request.method == 'POST':
211+
form = ImagensForm(request.POST, request.FILES)
212+
for f in request.FILES.getlist('imagens'):
213+
Imagens(imagem=f).save()
214+
215+
return render(request, 'galeria.html', {'form':ImagensForm, 'imgs':Imagens.objects.all()})
216+
217+
Tudo pronto, agora já temos um galeria simples.
218+
O código está disponível no [GitHub](https://github.com/dyesten/cloudinary_example/).
219+

0 commit comments

Comments
 (0)