<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Iker Perez de Albeniz &#187; Google App Engine</title>
	<atom:link href="http://www.ikeralbeniz.net/category/tecnologia/google-app-engine-tecnologia/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ikeralbeniz.net</link>
	<description>mi propio egolog sobre tecnología y frikadas varias</description>
	<lastBuildDate>Mon, 26 Apr 2010 15:54:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Usar/Crear Filtros para las plantillas de django/Google App Engine</title>
		<link>http://www.ikeralbeniz.net/2010/03/11/usarcrear-filtros-para-las-plantillas-de-djangogoogle-app-engine/</link>
		<comments>http://www.ikeralbeniz.net/2010/03/11/usarcrear-filtros-para-las-plantillas-de-djangogoogle-app-engine/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 11:17:03 +0000</pubDate>
		<dc:creator>Iker</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[filters]]></category>
		<category><![CDATA[filtros]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google App Engine]]></category>
		<category><![CDATA[plantillas]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[templates]]></category>

		<guid isPermaLink="false">http://www.ikeralbeniz.net/?p=193</guid>
		<description><![CDATA[Una de los temas mas interesante en Google App Engine es la posibilidad de usar plantillas. En la página de GAE existen<a href="http://code.google.com/intl/es/appengine/docs/python/gettingstarted/templates.html"> ejemplos sencillos de cómo utilizar plantillas</a>.El problema empieza cuando dentro de esas plantillas quieres hacer tratamiento de los datos para mostrar los datos correctamente. En esta articulo intentaremos explicar como usar esos filtros y como crear propios.]]></description>
			<content:encoded><![CDATA[<p>Una de los temas mas interesante en Google App Engine es la posibilidad de usar plantillas. En la página de GAE existen<a href="http://code.google.com/intl/es/appengine/docs/python/gettingstarted/templates.html"> ejemplos sencillos de cómo utilizar plantillas</a>.El problema empieza cuando dentro de esas plantillas quieres hacer tratamiento de los datos para mostrar los datos correctamente. En esta articulo intentaremos explicar como usar esos filtros y como crear propios.</p>
<p>Como habéis podido ver en el ejemplo de la pagina de GAE, la forma de mostrar un valor en la plantilla es usando la sintaxis <strong>{{ variable }}</strong>. En la mayoría de los casos dichas variables serán de tipo string o integer por lo que su visualización no tendrá mayor problema. Pero por ejemplo en el caso de variables tipo datetime u otro tipo de objeto propio, el sistema de plantillas no es capaz de mostrar el contenido de dichas variables, ya que solo es capaz de mostrar valores tipo string o integer.</p>
<p>Para los tipos de datos mas comunes existen ya filtros por defecto como es el caso de los valores datetime. La forma de aplicar un filtro es la siguiente:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="br0">&#123;</span><span class="br0">&#123;</span>variable|filtro<span class="br0">&#125;</span><span class="br0">&#125;</span></div>
</div>
<p>Y en algunos casos:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="br0">&#123;</span><span class="br0">&#123;</span>variable|filtro:argumento<span class="br0">&#125;</span><span class="br0">&#125;</span></div>
</div>
<p>En el caso de los valores datetime que hemos comentado antes, para mostrar un valor de fecha deberemos usar el filtro date de la siguiente manera:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="br0">&#123;</span><span class="br0">&#123;</span>mydatevar|date:<span class="st0">&quot;j&quot;</span><span class="br0">&#125;</span><span class="br0">&#125;</span></div>
</div>
<p>Esto seria equivalente a ejecutar una función <strong>date(mydatevar,”j”)</strong> y lo que estoy haciendo es mostrar el día del mes (<a href="http://docs.python.org/library/datetime.html#strftime-behavior">código %j</a>) similar a como se hace en otros lenguajes de programación.</p>
<p><a href="http://docs.djangoproject.com/en/dev/ref/templates/builtins/">Aquí</a> podéis encontrar un listado con los principales filtros predeterminados en django</p>
<p>El problema es cuando estas funciones no son suficientes para hacer lo que nosotros queremos, o queremos tratar tipos de objetos poco comunes o propios.</p>
<p>Por ejemplo imaginemos que queremos tenemos un libro de visitas donde los usuarios puede escribir entradas, e indican su dirección de correo. Pero no queremos que esa dirección de correo sea visible para que no pueda ser rastreada por spammers, por lo que optamos por mostrar solo los 5 primeros caracteres de el nombre de usuario de la cuenta de correo mas tres puntos suspensivos (algo parecido a lo que se hace en las listas de distribución). Es decir para <strong>estoesunaprueba@gmail.com</strong> nos generara una dirección del tipo <strong>estoe…@gmail.com</strong>.</p>
<p>Por tanto nuestra función en python seria algo así como:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="kw1">def</span> securemail <span class="br0">&#40;</span>mail<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span>:<span class="nu0">5</span><span class="br0">&#93;</span>+”…@”+ mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span></div>
</div>
<p>Es decir, dividimos la dirección en usuario y dominio con la función split y el carácter @, y generamos una nueva dirección con los primeros 5 caracteres de el usuario mas tres puntos suspensivos la arroba y el dominio.</p>
<p>Para poder usar esta función en nuestras plantillas haremos lo siguiente. Crearemos un script customfilters.py donde guardaremos todas nuestros filtros. Dicho script tendrá la siguiente forma</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="kw1">from</span> google.<span class="me1">appengine</span>.<span class="me1">ext</span> <span class="kw1">import</span> webapp<br />
<span class="kw1">from</span> <span class="kw3">datetime</span> <span class="kw1">import</span> <span class="kw3">datetime</span><br />
&nbsp;<br />
register = webapp.<span class="me1">template</span>.<span class="me1">create_template_register</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp;<br />
<span class="kw1">def</span> securemail <span class="br0">&#40;</span>mail<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#91;</span>:5<span class="br0">&#93;</span>+”…@”+ mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span>1<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
register.<span class="kw2">filter</span><span class="br0">&#40;</span>securemail<span class="br0">&#41;</span></div>
</div>
<p>Para importar los filtros en nuestra aplicación añadiremos la siguiente sentencia justo después de los imports.</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;">webapp.<span class="me1">template</span>.<span class="me1">register_template_library</span><span class="br0">&#40;</span><span class="st0">&#8216;customfilters&#8217;</span><span class="br0">&#41;</span></div>
</div>
<p>De esta forma podremos usar nuestro filtro de la siguiente manera:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="br0">&#123;</span><span class="br0">&#123;</span>mail|securemail<span class="br0">&#125;</span><span class="br0">&#125;</span></div>
</div>
<p>Imaginemos que damos la opción al usuario que la función securemail muestre su cuenta de dos modos, uno, el por defecto que es el funcionamiento explicado anteriormente, y otro, que hace que solo se muestre el usuario sin el dominio. Por tanto deberemos definir un parámetro en la función para poder elegir el tipo de ofuscación. La función en este caso nos quedaría así:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="kw1">def</span> securemail <span class="br0">&#40;</span>mail,default=true<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> default:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#91;</span>:5<span class="br0">&#93;</span>+”…@”+ mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span>1<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> mail.<span class="me1">split</span><span class="br0">&#40;</span>‘@’<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span></div>
</div>
<p>Por tanto si la variable mail tomara el valor estoesunaprueba@gmail.com este seria el resultado para las diferentes expresiones:</p>
<div class="codesnip-container" >
<div class="python codesnip" style="font-family:monospace;"><span class="br0">&#123;</span><span class="br0">&#123;</span>mail|securemail<span class="br0">&#125;</span><span class="br0">&#125;</span> <span class="co1">#estoe…@gmail.com</span><br />
<span class="br0">&#123;</span><span class="br0">&#123;</span>mail|securemail:true<span class="br0">&#125;</span><span class="br0">&#125;</span> <span class="co1">#estoe…@gmail.com</span><br />
<span class="br0">&#123;</span><span class="br0">&#123;</span>mail|securemail:false<span class="br0">&#125;</span><span class="br0">&#125;</span> <span class="co1">#estoesunaprueba</span></div>
</div>
<p>De esta forma podemos controlar y procesar la información a mostrar en nuestra plantilla cuando esta se trata de un objeto no string (o integer).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ikeralbeniz.net/2010/03/11/usarcrear-filtros-para-las-plantillas-de-djangogoogle-app-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
