Formulário de contato no Django usando captchasblow

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

You can leave a response, or trackback from your own site.

Leave a Reply

Powered by WordPress | Shop the Best Verizon Wireless Deals. | Thanks to Best CD Rates, Credit Cards and Credit card