<?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>Django &#8211; Alejandro Franco</title>
	<atom:link href="https://jafrancov.com/tag/django/feed/" rel="self" type="application/rss+xml" />
	<link>https://jafrancov.com</link>
	<description>Python, Django y lo que nadie explica en los tutoriales</description>
	<lastBuildDate>Tue, 11 Jan 2022 18:38:01 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
<site xmlns="com-wordpress:feed-additions:1">14205669</site>	<item>
		<title>Django + AllAuth + Google OAuth 2.0</title>
		<link>https://jafrancov.com/2021/01/django-allauth-google-oauth-2-0/</link>
					<comments>https://jafrancov.com/2021/01/django-allauth-google-oauth-2-0/#respond</comments>
		
		<dc:creator><![CDATA[Alex Franco]]></dc:creator>
		<pubDate>Sat, 09 Jan 2021 18:15:49 +0000</pubDate>
				<category><![CDATA[Codigo]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[AllAuth]]></category>
		<category><![CDATA[Bootstrap]]></category>
		<category><![CDATA[CrispyForms]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Google OAuth]]></category>
		<category><![CDATA[OAuth 2.0]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://jafrancov.com/?p=2621</guid>

					<description><![CDATA[Un ejercicio para demostrar la integración de Django AllAuth para el control de cuentas de usuario. En resumen: Configuración básica de entorno virtual y Django. Instalación y configuración de AllAuth. Integración de Bootstrap y Crispy Forms. Configuración y autenticación con Google Oauth 2.0 Enjoy!]]></description>
										<content:encoded><![CDATA[
<p>Un ejercicio para demostrar la integración de Django AllAuth para el control de cuentas de usuario. </p>



<p>En resumen:</p>



<ul class="wp-block-list"><li>Configuración básica de entorno virtual y Django.</li><li>Instalación y configuración de AllAuth.</li><li>Integración de Bootstrap y Crispy Forms.</li><li>Configuración y autenticación con Google Oauth 2.0</li></ul>



<figure class="wp-block-embed is-type-rich is-provider-gestor-del-servicio wp-block-embed-gestor-del-servicio wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe class="youtube-player" width="900" height="507" src="https://www.youtube.com/embed/jEJFK6jF5CE?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=es-MX&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p><em>Enjoy!</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://jafrancov.com/2021/01/django-allauth-google-oauth-2-0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2621</post-id>	</item>
		<item>
		<title>Servir o publicar imágenes con Django y MongoDB (GridFS)</title>
		<link>https://jafrancov.com/2014/09/servir-publicar-imagenes-django-mongodb-gridfs/</link>
					<comments>https://jafrancov.com/2014/09/servir-publicar-imagenes-django-mongodb-gridfs/#respond</comments>
		
		<dc:creator><![CDATA[Alex Franco]]></dc:creator>
		<pubDate>Tue, 23 Sep 2014 17:13:46 +0000</pubDate>
				<category><![CDATA[Codigo]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[GridFS]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[mongoengine]]></category>
		<category><![CDATA[pymongo]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">http://jafrancov.com/?p=2359</guid>

					<description><![CDATA[Mezclar Django y MongoDB es una tarea interesante, con los retos que implica ya que Django por default no tiene una integración con MongoDB como Base de Datos, sin embargo se han hecho esfuerzos por unirlos y hacerlos trabajar sacando las ventajas de ambos. Uno de los retos con los que me topé es usar ... <a title="Servir o publicar imágenes con Django y MongoDB (GridFS)" class="read-more" href="https://jafrancov.com/2014/09/servir-publicar-imagenes-django-mongodb-gridfs/" aria-label="Leer más sobre Servir o publicar imágenes con Django y MongoDB (GridFS)">Leer más</a>]]></description>
										<content:encoded><![CDATA[<p>Mezclar Django y MongoDB es una tarea interesante, con los retos que implica ya que Django por default no tiene una integración con MongoDB como Base de Datos, sin embargo se han hecho esfuerzos por unirlos y hacerlos trabajar sacando las ventajas de ambos.</p>
<p>Uno de los retos con los que me topé es usar GridFS que podemos entenderlo así:</p>
<blockquote><p>MongoDB puede ser utilizado con un sistema de archivos, tomando la ventaja de la capacidad que tiene MongoDB para el balanceo de carga y la replicación de datos utilizando múltiples servidores para el almacenamiento de archivos. Esta función (que es llamada <strong>GridFS</strong> ) está incluida en los drivers de MongoDB y disponible para los lenguajes de programación que soporta MongoDB. Esta base de datos expone funciones para la manipulación de archivos y contenido a los desarrolladores. En un sistema con múltiple servidores, los archivos pueden ser distribuidos y copiados entre los mismos varias veces y de una forma transparente, de esta forma se crea un sistema eficiente que maneja fallos y balanceo de carga.</p></blockquote>
<p>Bien, en resumen, es un sistema de archivos de MongoDB.</p>
<p>Mi problema era publicar las imágenes dado que no las almacena en una carpeta pública por así decirlo, así que había que buscar la solución vía programación. Antes de seguir, los paquetes que estoy usando son los siguientes:</p>
<ul>
<li>Django</li>
<li>MongoDB</li>
<li>mongoengine</li>
<li><a href="https://github.com/jschrewe/django-mongodbforms">django-mongodbforms</a></li>
<li>PIL</li>
</ul>
<p>Para el caso usé un modelo bastante sencillo, digamos que mi aplicación es un Blog y mi modelo es de un Post</p>
<pre class="brush: python; title: ; notranslate">
from mongoengine import *
from mongodbforms import DocumentForm


class Post(Document):
    title = StringField(max_length=160, required=True)
    body = StringField(required=True)
    image = ImageField(size=(800, 600, True), thumbnail_size=(150, 112, True))


class PostForm(DocumentForm):
    class Meta:
        document = Post
</pre>
<p>Hay 2 maneras de realizar la tarea:</p>
<ol>
<li>Sin thumbnail (miniatura), donde es 100% django.</li>
<li>Con thumbnail, donde tendremos que recurrir a pymongo + django</li>
</ol>
<p>La primera es muy sencilla, si tu aplicación no requiere de miniaturas, esta es la mejor opción, simplemente requieres conocer el ID de tu imagen:</p>
<pre class="brush: python; title: ; notranslate">
''' blog/views.py '''
def view_post(request, id):
    post = get_document_or_404(Post, pk=id)
    # img_id temporal para mandar llamar la imagen
    # Si no contiene imagen el post, no muestra nada
    try:
        post.img_id = post.image._id
    except AttributeError:
        post.img_id = False
    return render_to_response('post.html', {'post': post})


def display_image(request, id):
    image = get_document_or_404(Post, image=ObjectId(id)).image
    return HttpResponse(image.read(), content_type=image.contentType)


''' blog/urls.py '''
# ...
                       url(r'^post/(?P&lt;id&gt;\w+)/$', 'view_post'),
                       url(r'^media/(?P&lt;id&gt;\w+)$', 'display_image'),
# ...


''' blog/templates/post.html '''
&lt;p&gt;&lt;a href=&quot;/blog/&quot;&gt;View all posts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;h2&gt;{{ post.title }}&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;{{ post.body }}&lt;/p&gt;
{% if post.img_id %}
&lt;p style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;/blog/media/{{ post.img_id }}&quot;&gt;&lt;/p&gt;
{% endif %}
</pre>
<p>Si por alguna razón requieres el uso de las miniaturas, esta es la receta de cocina para obtener la imagen regular o la miniatura, esto es debido a que directamente con el ORM de Django con mongoengine no hay manera de hacer referencia a la miniatura:</p>
<pre class="brush: python; title: ; notranslate">
''' blog/views.py '''
def view_post_th(request, id):
    post = get_document_or_404(Post, pk=id)
    # img_id temporal para mandar llamar la imagen
    # Si no contiene imagen el post, no muestra nada
    try:
        post.img_id = post.image._id
    except AttributeError:
        post.img_id = False
    try:
        post.thumbnail_id = post.image.thumbnail_id
    except AttributeError:
        post.thumbnail_id = False
    return render_to_response('post2.html', {'post': post})


def display_image_m2(request, id):
    # Conexión adicional al sistema de archivos de MongoDB
    mongo_con = Connection()
    # Si tu campo en el modelo es ImageField, la collección es 'images'
    grid_fs = gridfs.GridFS(mongo_con.servemedia, collection='images')
    if not grid_fs.exists(ObjectId(id)):
        raise Exception(&quot;Mongo file does not exist! {0}&quot;.format(ObjectId(id)))
    image = grid_fs.get(ObjectId(id))
    try:
        # Con esta validación sabemos si es miniatura o imagen original,
        # el thumbnail por default se guarda sin el contentType
        content_type = image.contentType
    except AttributeError:
        # Con esto buscamos la imagen original para obtener el contentType del thumbnail
        for grid_out in grid_fs.find({'thumbnail_id': ObjectId(id)}).limit(1):
            content_type = grid_out.contentType
    return HttpResponse(image.read(), content_type=content_type)


''' blog/urls.py '''
# ...
                       url(r'^post2/(?P&lt;id&gt;\w+)/$', 'view_post_th'),
                       url(r'^media2/(?P&lt;id&gt;\w+)$', 'display_image_m2'),
# ...


''' blog/templates/post2.html '''
&lt;p&gt;&lt;a href=&quot;/blog/&quot;&gt;View all posts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;h2&gt;{{ post.title }}&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;{{ post.body }}&lt;/p&gt;
{% if post.thumbnail_id %}
&lt;p style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;/blog/media2/{{ post.thumbnail_id }}&quot;&gt;&lt;/p&gt;
{% endif %}
{% if post.img_id %}
&lt;p style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;/blog/media2/{{ post.img_id }}&quot;&gt;&lt;/p&gt;
{% endif %}
</pre>
<p>El código completo puedes encontrarlo en mi GitHub  <a href="https://github.com/jafrancov/Serve-Media-Django-MongoDB-GridFS">https://github.com/jafrancov/Serve-Media-Django-MongoDB-GridFS</a> espero les sirva y sea de su agrado, cualquier duda, deja tu comentario.</p>
<p style="text-align: right;"><em>Enjoy!</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://jafrancov.com/2014/09/servir-publicar-imagenes-django-mongodb-gridfs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2359</post-id>	</item>
	</channel>
</rss>
