GustavoHenrique.net

  • About
  • Contact
  • RSS Feed
  • Twitter

 

28
Nov

Formulário de contato no Django usando captchasblow

By gustavohenrique|Django|Be the first to comment!

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

Bookmark It

Add to Del.icio.us Add to Diigo Add to Facebook Add to Google Bookmarks Add to LinkedIn Add to Mister Wong Add to Twitter Add to Yahoo My Web
Tagged as: captcha, contact form, Django, e-mail, gmail
Add your comment →

0 Comments

Leave your comment below! Cancel Reply

View More Posts:
  • ←
  • →

Tags

admin Django extjs firewall grails jquery KingHost liberações Linux manual model modelform mod_wsgi moeda brasileira mudanças mysql nível de serviço oo PagSeguro pdf php PIL pisa problemas proxy python qa qos real relacionamento roteamento service desk shell script sites tdd tipsforlinux traducao ubicomp ubuntu urllib virtualhost Webservices wikipedia xsol __init__

Recent Posts

  • Configurando um servidor LDAP no CentOS 6.2
  • Introdução ao padrão MVC no Ext JS 4
  • Virtualização com KVM
  • Autenticação Facebook no Grails
  • Grails com Sqlite3 no Ubuntu 11.04
  • Deploy no tomcat usando django-jython
  • Deploy múltiplas versões do Django no Nginx com VirtualEnv
  • Comandos básicos do Git
  • Introdução ao Apache Wicket
  • Feliz 2011

Archives

Categories

My tweets

  • @tregismoreira Genesis 7200 com android 4 2 days ago
  • @marcomaciel blz! 1 week ago
  • @marcomaciel hack com qualquer linguagem em qualquer plataforma pra mim ta valendo! #soudev 1 week ago
  • Fui instalar o android 2.3 da lg e agora meu celular não liga. #ffuuu 1 week ago
  • Tentando gerar uma NFe e não consigo =/ #stacktrace Impressionante como todos os sites e apps do governo são ruins. 2 weeks ago
  • More updates...

Powered by the inLine Minimal WordPress Theme