Mostrando postagens com marcador django. Mostrar todas as postagens
Mostrando postagens com marcador django. Mostrar todas as postagens

sexta-feira, 11 de janeiro de 2013

Django simple captcha no Ubuntu 12.10

Nenhum comentário:
Hoje eu estava desenvolvendo um projeto em Django que precisa de Captcha no cadastro de usuários. Já tenho familiaridade com o Simple Captcha, e resolvi usar novamente.

Esta aplicação Django tem uso bastante simples, mas eu não conseguia fazer a exibição das imagens corretamente. Eu usei a ferramenta virtualenv para montar meu ambiente de desenvolvimento, e as bibliotecas estavam instaladas lá via pip. A biblioteca PIL é uma dependência de Simple Captcha, justamente por permitir a criação de imagens por código. No meu formulário, ficou assim:

captcha = CaptchaField( label = 'Repita os caracteres a seguir')


Mas a exibição do formulário continha apenas o texto alternativo. O comando manage.py runserver mostrava um código 500 para a URL das imagens do captcha. Acessando a imagem da URL em si, pude verificar o seguinte erro:

The _imagingft C module is not installed

Um erro que já tinha me deparado antes, mas nunca registrei a solução. Essencialmente, a instalação via pip compila a bilioteca PIL, e o uso do Simple Captcha requer o suporte a Freetype2 no momento da compilação para poder gerar as imagens corretamente. Para corrigir isso no Ubuntu 12.10, basta colocar as referências certas antes da compilação:

# ln -s /usr/lib/`uname -i`-linux-gnu/libfreetype.so /usr/lib/
# ln -s /usr/lib/`uname -i`-linux-gnu/libjpeg.so /usr/lib/
# ln -s /usr/lib/`uname -i`-linux-gnu/libz.so /usr/lib/

Depois, basta instalar a biblioteca PIL:

pip install pil

A mensagem final da compilação deverá mostrar algo como

    --------------------------------------------------------------------
    PIL 1.1.7 SETUP SUMMARY
    --------------------------------------------------------------------
    version       1.1.7
    platform      linux2 2.7.3 (default, Sep 26 2012, 21:51:14)
                  [GCC 4.7.2]
    --------------------------------------------------------------------
    *** TKINTER support not available
    --- JPEG support available
    --- ZLIB (PNG/ZIP) support available
    --- FREETYPE2 support available
    *** LITTLECMS support not available
    --------------------------------------------------------------------

E deverá funcionar! Encontrei a solução neste link.

sábado, 3 de outubro de 2009

Brincando com o Django

2 comentários:
Esta semana estive brincando com o Django. Corrigindo: há algum tempo estou brincando com ele, pois estamos implementando o sistema administrativo da FEBRACE lá no LSI-NATE.

Enfim, o fato é que usamos Django para implementar o sistema de submissão de projetos, avaliação e outras partes internas de gerenciamento. Por motivos de políticas de acesso, em diversos momentos precisamos de campos exibidos com uma permissão de "somente leitura" dentro do sistema Admin.

Pesquisando um bocado por aí, conclui que deveria criar um campo específico para este fim e usar nos formulários conforme precisássemos. Aí vai a minha ideia:
  • Criar um arquivo "fields.py" (no meu caso, ele já existia)
  • Inserir o trecho de código a seguir
  • Usar os campos "ReadOnly" em formulários como qualquer outro Field do Django
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe
class ReadOnlyWidget(forms.Widget):
    def render(self, name, value, attrs=None):
        if value is None: value = ''
        if value != '':
            # usa necessariamente Unicode
            value = force_unicode(value)
        return mark_safe(u'' % value)

class ReadOnlyField(forms.Field):
    widget = ReadOnlyWidget()

class ReadOnlyChoiceField(forms.ModelChoiceField):
    widget = forms.Select(attrs={'disabled':'true'})

O ReadOnlyField pode ser usado para campos "normais"; os que estabelecem relacionamento do tipo ForeignKey, devem usar o ReadOnlyChoiceField. O primeiro exibe o valor armazenado usando a tag HTML "label" e o segundo exibe um "select" desabilitado.

Faça bom proveito e deixe seus comentários!