Introdução
Nesse artigo vou demonstrar como criar um formulário de contato contendo um campo captcha para enviar e-mail no Django, muito comum em blogs.
Segundo consta na wikipedia, CAPTCHA é um acrônimo da expressão “Completely Automated Public Turing test to tell Computers and Humans Apart” (teste de Turing público completamente automatizado para diferenciar entre computadores e humanos): um teste de desafio cognitivo, utilizado como ferramenta anti-spam.
Captchasblow é uma aplicação desenvolvida por Brandon Low, plugável em qualquer projeto em Django, capaz de gerar um captcha. Vale lembrar que para conseguir gerar a imagem do captcha, faz-se necessário o uso da PIL, uma biblioteca em python para manipulação de imagens. Não irei abordar o processo de instação dessa biblioteca, uma vez que na maioria das distribuições Linux atuais é relativamente simples.
Funcionamento
O captchasblow gera uma string aleatória, armazena no banco de dados o valor dessa string, cria uma imagem contendo a string armazenada, cria um campo hidden com o id do registro dessa string e um campo para o usuário digitar o código captcha. O processo de validação consulta o banco de dados e verifica se o valor do campo id corresponde ao código digitado pelo usuário.
Para utilizar o captchasblow é necessário que o form onde se deseja ter um campo captcha seja extendido de CaptchaForm. Assim, ao instanciar esse form, o construtor da classe automaticamente cria o captcha, bastando apenas renderizar no template.
Iniciando
Vou pular os passos de como criar um projeto e uma aplicação no Django e tomar como exemplo que meu projeto se chama captchaproject e minha aplicação minhaapp.
Primeiramente é preciso fazer o download do captchasblog no site do autor. Acessem http://www.lostlogicx.com/captchasblow/. No momento a última versão é a 0.4.
Extraia o conteúdo do arquivo dentro do diretório do projeto. Após isso será criado o diretório captcha contendo o código da aplicação. Dentro desse diretório há os seguintes arquivos:
gu@notebook:~/artigos/capthaproject$ ls -1 captcha/
total 52K
COPYING
forms.py
index.html
__init__.py
models.py
README.txt
settings.py
urls.py
util.py
views.py
Abra o arquivo forms.py e altere a linha 38 onde está class CaptchaForm(forms.BaseForm) para class CaptchaForm(forms.Form). Em seguida adicione a aplicação ao projeto, (adicionar captchaproject.captcha à variável INSTALLED_APPS contida no arquivo settings.py). E depois é necessário rodar o syncdb para criar a tabela no banco de dados.
É possível alterar algumas configurações como fonte, cor da fonte, quantidade de caracteres… no arquivo settings.py. No meu caso, usando o ubuntu-8.04, precisei alterar o caminho da fonte para FONT_PATH="/usr/share/fonts/truetype/ttf-bitstream-vera/VeraBd.ttf".
Instalado e configurado o captchasblog, é a vez da aplicação minhaapp. Começarei criando o arquivo forms.py que define o formulário para contato, com o seguinte conteúdo:
from django import forms from captchaproject.captcha.forms import CaptchaForm class ContatoForm(CaptchaForm): nome = forms.CharField(max_length=100,required=True) email = forms.EmailField(max_length=200,required=True) assunto = forms.CharField(max_length=100,required=True) mensagem = forms.CharField(max_length=10000,required=True,widget=forms.Textarea())
Agora vou criar os templates base.html, contato.html e sucesso.html.
base.html:
{%block principal%}
{%endblock%}contato.html:
{%extends 'base.html' %}
{%block principal%}
<!--
#id_nome,#id_email,#id_assunto,#id_mensagem { width:305px; }
.lineform { height: 35px; }
label.label1 { display:block; float:left; width:100px; text-align:right; padding:6px; }
#status { color:red; font-size:14px; }
-->
<form id="contactform" action="/enviarmsg/" method="post">
<div class="lineform">
<label class="form1" for="id_nome">Nome:</label> {{form.nome}}</div>
<div class="lineform">
<label class="form1" for="id_email">E-mail:</label> {{form.email}}</div>
<div class="lineform">
<label class="form1" for="id_assunto">Assunto:</label> {{form.assunto}}</div>
<div class="lineform" style="height: auto;">
<label class="form1" for="id_mensagem">Mensagem:</label> {{form.mensagem}}</div>
<div class="lineform" style="padding-top: 10px; height: 50px;">
<label class="form1">Verificação</label> {{form.captcha|safe}} {{form.captcha_id|safe}}</div>
<div class="lineform" style="padding-top:10px;">
<label class="form1"> </label>
<input name="enviar" type="submit" value="Enviar Mensagem" /></div>
</form>
<div id="status">
{% for campo in form%}
{%if campo.errors%}
{{campo.label}}: {{campo.errors}}
{%endif%}
{%endfor%}</div>
{%endblock%}sucesso.html:
{%extends 'base.html'%}
{%block principal%}
<div style="”color:green;font-size:14px;”">
Sua mensagem voi enviada com sucesso.</div>
{%endblock%}Terceiro passo é criação das views dentro do arquivos views.py:
# -*- coding: utf-8 -*- from django.shortcuts import render_to_response from django.http import HttpResponse,HttpResponseRedirect from captchaproject.minhaapp.forms import * from django.core.mail import EmailMessage def contato(request): contatoform = ContatoForm() return render_to_response('contato.html', { 'form':contatoform }) def sucesso(request): return render_to_response('sucesso.html') def enviarmsg(request): if request.method == 'POST': contatoform = ContatoForm(request.POST) if contatoform.is_valid(): nome = request.POST.get('nome') email = request.POST.get('email') assunto = request.POST.get('assunto') mensagem = request.POST.get('mensagem') mail = EmailMessage(assunto,mensagem,email,['meulogin@meuprovedor.com']) try: mail.send() return HttpResponseRedirect('/sucesso/') except: return HttpResponse('Erro: Problemas tecnicos no servidor de email.') else: return render_to_response('contato.html',{'form':contatoform}) else: return HttpResponse("Erro: Nenhum form foi submetido.")
Último passo é fazer o mapeamento de URLs no arquivo urls.py:
from django.conf.urls.defaults import * from captchaproject.captcha.views import captcha_image urlpatterns = patterns('', (r'^contato/$','captchaproject.minhaapp.views.contato'), (r'^sucesso/$','captchaproject.minhaapp.views.sucesso'), (r'^enviarmsg/$','captchaproject.minhaapp.views.enviarmsg'), (r'^captcha/(?P[0-9]+)/$', captcha_image) )
E para finalizar, vou configurar o Django para enviar e-mail. Para isso, é necessário alterar o settings.py, adicionando as variáveis:
EMAIL_HOST="smtp.meuprovedor.com" EMAIL_PORT="25" EMAIL_HOST_USER="meuemail@meuprovedor.com" EMAIL_HOST_PASSWORD="minhasenha" EMAIL_USE_TLS=True # caso o servidor requerer autenticação TLS
Exemplo de como configurar para enviar e-mail pelo gmail:
EMAIL_HOST="smtp.gmail.com" EMAIL_PORT="587" EMAIL_HOST_USER="meulogin@gmail.com" EMAIL_HOST_PASSWORD="minhasenha" EMAIL_USE_TLS=True
Conclusão
Foi mostrado como criar um formulário para contato, usar captcha e enviar e-mail. Há outras alternativas para captcha como o reCaptcha e django-captcha, porém por questão de preferência optei pelo captchasblow por ser mais fácil de configurar a aparência.
Gostaria de agradecer aos amigos do grupo django-br pela ajuda.
Referência
captchasblow: http://www.lostlogicx.com/captchasblow/
django-captcha: http://code.google.com/p/django-captcha/
reCaptcha: http://www.recaptcha.net














Posted in
Tags: 