2010-05-19 3 views
5

Nei miei modelli uso spesso campi di testo che sono destinati a contenere grandi pezzi di input formattati in tessuto. Mi piacerebbe automaticamente offuscare tutti gli indirizzi e-mail che vengono inseriti in questi campi di testo, così che quando vengono stampati in un modello non sono visibili agli spider.Come posso nascondere gli indirizzi e-mail contenuti nei campi di testo "input gratuito" in Django

C'è un modo intelligente per farlo?

Aggiornamento:

in base alla risposta del lazerscience sotto, questo è stato il codice ho finito per usare. Ho chiamato il file encode_mailto.py e l'ho inserito in una directory templatetags, all'interno di un'app di tipo "utilities" che installo nella maggior parte dei miei progetti di 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> 

Quindi utilizzare nel template come segue:

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

risposta

2

Se si desidera solo per usarlo come filtro tag Template:

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) 

quindi è possibile utilizzare nel tuo template per esempio:

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

Perfetto, Grazie. Ho aggiornato la mia domanda con una descrizione di come questo approccio ha funzionato nel mio progetto. – bitbutter

2

s' Here qualcosa che può essere utilizzato.

Il trucco consiste nell'aggiungere un codice di offuscamento della posta elettronica che renderà difficile la cattura degli indirizzi di posta elettronica utilizzando un client non js.

Aggiungi come un middlware, o meglio come un simpletag che può agire su oggetti contenenti dati tessili.

0

È possibile utilizzare django-email-obfuscator. In primo luogo, installarlo:

$ pip install django-email-obfuscator 

Poi, aggiungere email_obfuscator-INSTALLED_APPS in settings.py:

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

nei modelli, è possibile proteggere indirizzi e-mail con il filtro obfuscate:

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

per quanto vedo, django-email-obfuscator può solo offuscare semplici indirizzi email, nessun blocco di testo (html) ...?! – benzkji