В моих моделях я часто использую текстовые поля, которые предназначаются для содержания больших частей отформатированного тканью входа. Я хотел бы автоматически запутать любые адреса электронной почты, которые введены в эти текстовые поля, так, чтобы, когда они печатаются в шаблоне, они не были видимы паукам.
Существует ли умный способ сделать это?
Обновление:
На основе ответа lazerscience ниже, это было кодом, который я закончил тем, что использовал. Я назвал файл encode_mailto.py и поместил его в templatetags каталог в приложении типа 'утилит', которое я устанавливаю в большинство своих 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]+@[-.\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>
Затем используйте его в шаблонах следующим образом:
{% load encode_mailto %}
{{"A bunch of text with an email address emailaddress@host.com"|encode_mailto }}
Если вы просто хотите использовать его как фильтр тегов шаблонов:
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]+@[-.\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)
Тогда вы можете использовать его в своих шаблонах, например:
{{ "<a href='mailto:mail@email.com'>Send Mail</a>"|encode_mailto }}
Вот то, что можно использовать.
Уловка состоит в том, чтобы добавить код обфускации электронной почты, который затруднит захват ваших адресов электронной почты с помощью клиента, отличного от js.
Добавьте его как промежуточное программное обеспечение или, скорее, как простой тег, который может воздействовать на объекты, содержащие текстильные данные.