2010-05-19 18 views
5

Dans mes modèles, j'utilise souvent des champs de texte qui sont destinés à contenir de gros morceaux d'entrée au format textile. Je voudrais masquer automatiquement les adresses e-mail saisies dans ces champs de texte, de sorte que lorsqu'elles sont imprimées dans un modèle, elles ne sont pas visibles par les robots.Comment puis-je masquer les adresses électroniques contenues dans les champs de texte « entrée libre » dans Django

Y at-il une façon intelligente de le faire?

Mise à jour:

Sur la base de la réponse de lazerscience ci-dessous, ce fut le code i fini par utiliser. J'ai nommé le fichier encode_mailto.py et l'ai placé dans un répertoire templatetags, à l'intérieur d'une application de type 'utilities' que j'installe dans la plupart de mes projets 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> 

utiliser ensuite dans des modèles comme suit:

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

Répondre

2

Si vous voulez juste l'utiliser comme filtre de balise de modèle:

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) 

Ensuite, vous pouvez l'utiliser dans vos modèles par exemple:

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

Parfait, Merci. J'ai mis à jour ma question avec une description de comment j'ai obtenu cette approche fonctionnant dans mon projet. – bitbutter

2

de Here quelque chose qui peut être utilisé.

Trick est d'ajouter un e-mail le code d'obscurcissement qui fera votre adresse e-mail difficile d'être capturé à l'aide d'un client non-js.

Ajoutez comme middlware, ou plutôt comme un simpletag qui peut agir sur les objets contenant des données textiles.

0

Vous pouvez utiliser django-email-obfuscator. Tout d'abord, l'installer:

$ pip install django-email-obfuscator 

Ensuite, ajoutez email_obfuscator-INSTALLED_APPS dans settings.py:

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

Dans vos modèles, vous pouvez protéger les adresses e-mail avec le filtre obfuscate:

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

pour autant que je sache, django-email-obfuscator ne peut qu'obscurcir des adresses e-mail simples, pas de bloc de texte (html) ...?! – benzkji