2010-05-19 10 views
5

En mis modelos, a menudo uso campos de texto que están destinados a contener grandes piezas de entrada con formato textil. Me gustaría ofuscar automáticamente cualquier dirección de correo electrónico que se ingrese en estos campos de texto, de modo que cuando se impriman en una plantilla no sean visibles para las arañas.¿Cómo puedo oscurecer las direcciones de correo electrónico contenidas en los campos de texto de 'entrada libre' en Django

¿Hay alguna manera inteligente de hacerlo?

Actualización:

Sobre la base de la respuesta de lazerscience más adelante, este fue el código que terminé usando. Puse el nombre del archivo codde_mailto.py y lo puse en un directorio templatetags, dentro de una aplicación tipo 'utilidades' que instalé en la mayoría de mis proyectos django.

import re 
import random 
from django.utils.safestring import mark_safe 
from django import template 
register = template.Library() 

email_link_pat = re.compile(r'<a\s+href=("|\')?mailto:[^>]+>[^<]*</a>') 
email_pat = re.compile(r'\b[-.\w][email protected][-.\w]+\.[a-z]{2,4}\b') 

def get_script(m): 
    code_list = [] 
    for c in m.group(0): 
     d = ord(c) 
     x = random.randint(0, d) 
     code_list.append("%d+%d" % (x, d-x)) 

    return '<script type="text/javascript">document.write(String.fromCharCode(%s))</script>' % \ 
     ",".join(code_list) 

def encode_mailto(text): 
    text = email_link_pat.sub(get_script, text) 
    text = email_pat.sub(get_script, text) 
    return mark_safe(text) 

register.filter('encode_mailto', encode_mailto)</pre> 

A continuación, utilizarlo en las plantillas de la siguiente manera:

{% load encode_mailto %} 
{{"A bunch of text with an email address [email protected]"|encode_mailto }} 

Respuesta

2

Si lo que desea es utilizar como filtro de etiquetas de plantilla:

import re 
import random 
from django.utils.safestring import mark_safe 


email_link_pat = re.compile(r'<a\s+href=("|\')?mailto:[^>]+>[^<]*</a>') 
email_pat = re.compile(r'\b[-.\w][email protected][-.\w]+\.[a-z]{2,4}\b') 

def get_script(m): 
    code_list = [] 
    for c in m.group(0): 
     d = ord(c) 
     x = random.randint(0, d) 
     code_list.append("%d+%d" % (x, d-x)) 

    return '<script type="text/javascript">document.write(String.fromCharCode(%s))</script>' % \ 
     ",".join(code_list) 

@register.filter 
def encode_mailto(text): 
    text = email_link_pat.sub(get_script, text) 
    text = email_pat.sub(get_script, text) 
    return mark_safe(text) 

entonces usted puede utilizar en las plantillas mediante por ejemplo:

{{ "<a href='mailto:[email protected]'>Send Mail</a>"|encode_mailto }} 
+0

perfecto, Gracias. Actualicé mi pregunta con una descripción de cómo conseguí que este enfoque funcionara en mi proyecto. – bitbutter

2

Here 's algo que se puede utilizar.

El truco consiste en agregar un código de ofuscación de correo electrónico que dificultará la captura de direcciones de correo electrónico utilizando un cliente que no sea js.

Agregúelo como un middlware, o más bien como una simple etiqueta que puede actuar sobre objetos que contienen datos textiles.

0

Puede utilizar django-email-obfuscator. En primer lugar, instalarlo:

$ pip install django-email-obfuscator 

A continuación, añadir email_obfuscator-INSTALLED_APPS en settings.py:

INSTALLED_APPS = (
    # ... 
    'email_obfuscator', 
) 

en sus plantillas, puede proteger a direcciones de correo electrónico con el filtro obfuscate:

{% load email_obfuscator %} 
{{ '[email protected]'|obfuscate }} 
+0

por lo que veo, django-email-obfuscator solo puede ofuscar direcciones simples de correo electrónico, ningún bloque de texto (html) ...?! – benzkji

Cuestiones relacionadas