<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>KeroV.com - Django</title><link>http://www.kerov.com/</link><description>Últimos textos do KeroV.com</description><language>pt-br</language><lastBuildDate>Fri, 28 Oct 2011 19:15:09 -0200</lastBuildDate><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/kerov/django" /><feedburner:info uri="kerov/django" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>-23.62168</geo:lat><geo:long>-46.63919</geo:long><feedburner:emailServiceId>kerov/django</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><title>Fazendo deployment de sua aplicação em Django, Flask e afins com uWSGI e nginx</title><link>http://feedproxy.google.com/~r/kerov/django/~3/RIQfZv8YeWg/fazendo-deployment-de-sua-aplicacao-em-django-flask-e-afins-com-uwsgi-e-nginx.html</link><description>&lt;div&gt;&amp;nbsp;&amp;nbsp; Por que usar o &lt;strong&gt;uWSGI&lt;/strong&gt;? Porque atualmente &amp;eacute; a op&amp;ccedil;&amp;atilde;o mais &lt;strong&gt;perform&amp;aacute;tica e linda&lt;/strong&gt; de fazer deloyment de projetos em &lt;strong&gt;Python&lt;/strong&gt;, tanto faz se sua aplica&amp;ccedil;&amp;atilde;o &amp;eacute; escrita usando &lt;strong&gt;Django&lt;/strong&gt;, &lt;strong&gt;Flask&lt;/strong&gt; ou afins.&lt;br /&gt;&amp;nbsp;&amp;nbsp; Levando em conta que voc&amp;ecirc; j&amp;aacute; tenha o &lt;strong&gt;nginx&lt;/strong&gt; instalado, falarei apenas sobre a parte que envolve o &lt;strong&gt;uWSGI&lt;/strong&gt;.&lt;br /&gt;&amp;nbsp;&amp;nbsp; Primeiros passos:&lt;br /&gt;&amp;nbsp;&amp;nbsp; Primeiro instale os headers da &lt;strong&gt;libxml2&lt;/strong&gt; e do &lt;strong&gt;python&lt;/strong&gt;, no ubuntu por exemplo, digite apenas: &lt;strong&gt;sudo apt-get install libxml2-dev python-dev&lt;/strong&gt;.&lt;br /&gt;&amp;nbsp;&amp;nbsp; Com o &lt;strong&gt;PIP&lt;/strong&gt;, instale o &lt;strong&gt;uWSGI&lt;/strong&gt;: &lt;strong&gt;sudo pip install uWSGI&lt;/strong&gt;. O &lt;strong&gt;PIP&lt;/strong&gt; come&amp;ccedil;ar&amp;aacute; a compilar o &lt;strong&gt;uWSGI&lt;/strong&gt;, caso voc&amp;ecirc; n&amp;atilde;o tenha &lt;strong&gt;GCC, make, autoconf&lt;/strong&gt; e etc, instale com &lt;strong&gt;sudo apt-get install build-essential&lt;/strong&gt;.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Eu particularmente, escrevo as configura&amp;ccedil;&amp;otilde;es para o &lt;strong&gt;uWSGI&lt;/strong&gt; em arquivos &lt;strong&gt;INI&lt;/strong&gt;, segue uma configura&amp;ccedil;&amp;atilde;o que geralmente uso.&lt;/div&gt;
&lt;p&gt;
&lt;code class="ini"&gt;
&lt;br /&gt;[uwsgi]
&lt;br /&gt;touch-reload=/diretorio/projeto/tmp/restart.txt # Usado para que o uWSGI recarrege o seu fonte com um simples touch restart.txt
&lt;br /&gt;listen=1024 # N&amp;uacute;mero de itens em fila de espera
&lt;br /&gt;disable-logging=true # Deixa de logar requisi&amp;ccedil;&amp;otilde;es, far&amp;aacute; log apenas de erros.
&lt;br /&gt;socket=/diretorio/que/voce/quiser.sock # Caminho do socket que o uWSGI ouvir&amp;aacute;/escrever&amp;aacute;.
&lt;br /&gt;master=true # Ativa o processo master para controlar os rebeldes.
&lt;br /&gt;harakiri=60 # Modo suicida que matar&amp;aacute; a app ap&amp;oacute;s x segundos em execu&amp;ccedil;&amp;atilde;o.
&lt;br /&gt;processes=4 # N&amp;uacute;mero de workers.
&lt;br /&gt;buffer-size=25000 # Buffer mais alto porque muitas vezes alguns browsers mandam headers gigantes.
&lt;br /&gt;daemonize=/diretorio/que/voce/quiser.log # Joga o processo para background e escreve o log no arquivo determinado.
&lt;br /&gt;post-buffering=8192 # Limite m&amp;aacute;ximo de tamanho do body do http, passando o limite, ele salva em disco.
&lt;br /&gt;pidfile=/diretorio/que/voce/quiser.pid # Arquivo que o n&amp;uacute;mero do processo master ser&amp;aacute; gravado.
&lt;br /&gt;pythonpath=/diretorio/do/seu/projeto
&lt;br /&gt;module=wsgi # M&amp;oacute;dulo que o uWSGI carregar&amp;aacute; a sua app.
&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Com isso, sua app j&amp;aacute; deve funcionar com &lt;strong&gt;uwsgi --ini /arquivo/ini.ini&lt;/strong&gt;.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Para fazer o deployment com o nginx, voc&amp;ecirc; precisa de duas linhas apenas.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; No seu location / adicione:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; include uwsgi_params;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uwsgi_pass unix:/diretorio/do/socket.sock;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pronto, depolyment feito, n&amp;atilde;o se esque&amp;ccedil;a de colocar o &lt;strong&gt;nginx&lt;/strong&gt; para &lt;strong&gt;servir seus est&amp;aacute;ticos&lt;/strong&gt; sen&amp;atilde;o ser&amp;aacute; um tiro no p&amp;eacute; usar o &lt;strong&gt;uWSGI&lt;/strong&gt; para isso.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Wait!!! Como faz para fazer o &lt;strong&gt;uWSGI&lt;/strong&gt; iniciar com a m&amp;aacute;quina?&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - One word: &lt;strong&gt;upstart&lt;/strong&gt;.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - T&amp;aacute;! Como?&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Mais f&amp;aacute;cil do que tirar doce de crian&amp;ccedil;a.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Crie um arquivo .conf em /etc/init com o seguinte conte&amp;uacute;do:&lt;/div&gt;
&lt;p&gt;
&lt;code class="text"&gt;
&lt;br /&gt;start on (net-device-up
&lt;br /&gt;          and local-filesystems
&lt;br /&gt;          and runlevel [2345])
&lt;br /&gt;stop on runlevel [016]
&lt;br /&gt;respawn
&lt;br /&gt;expect daemon
&lt;br /&gt;exec uwsgi --ini /seu/arquivo/de/config/uwsgi.ini
&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Para executar a app, digite &lt;strong&gt;start nome_do_arquivo&lt;/strong&gt; sem o .conf &amp;eacute; claro. Outros comandos s&amp;atilde;o: &lt;strong&gt;stop&lt;/strong&gt;, &lt;strong&gt;restart&lt;/strong&gt; e &lt;strong&gt;status&lt;/strong&gt;.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pronto, espero que tenham gostado/achado &amp;uacute;til, qualquer d&amp;uacute;vida, comentem ou twittem para &lt;a href="http://twitter.com/jaysonsantos" target="_blank"&gt;@jaysonsantos&lt;/a&gt;.&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5DROQRPu8mk8bZieBr5JkZK3PyA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5DROQRPu8mk8bZieBr5JkZK3PyA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5DROQRPu8mk8bZieBr5JkZK3PyA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5DROQRPu8mk8bZieBr5JkZK3PyA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kerov/django/~4/RIQfZv8YeWg" height="1" width="1"/&gt;</description><pubDate>Fri, 28 Oct 2011 19:15:09 -0200</pubDate><guid isPermaLink="false">http://www.kerov.com/tutoriais-t/tutorial/fazendo-deployment-de-sua-aplicacao-em-django-flask-e-afins-com-uwsgi-e-nginx.html</guid><feedburner:origLink>http://www.kerov.com/tutoriais-t/tutorial/fazendo-deployment-de-sua-aplicacao-em-django-flask-e-afins-com-uwsgi-e-nginx.html</feedburner:origLink></item><item><title>Usando o uWSGI para enfileirar seus e-mails com Django</title><link>http://feedproxy.google.com/~r/kerov/django/~3/xMjEgAirzWQ/usando-o-uwsgi-para-enfileirar-seus-e-mails-com-django.html</link><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Acredito que muitas pessoas j&amp;aacute; tiveram a necessidade de enfileirar o envio de e-mails para que o usu&amp;aacute;rio n&amp;atilde;o espere a boa vontade do servidor SMTP e afins. Para isso, desenvolvi um backend para envio de e-mails em &lt;strong&gt;Django&lt;/strong&gt; que usa o &lt;strong&gt;Spooler&lt;/strong&gt; do &lt;strong&gt;uWSGI&lt;/strong&gt; para fazer a bendita fila.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Para quem n&amp;atilde;o conhece o Spooler do uWSGI, a documenta&amp;ccedil;&amp;atilde;o completa pode ser consultada em &lt;a href="http://projects.unbit.it/uwsgi/wiki/Spooler" target="_blank"&gt;http://projects.unbit.it/uwsgi/wiki/Spooler&lt;/a&gt;, e os lindos decorators, podem ser consultados em &lt;a href="http://projects.unbit.it/uwsgi/wiki/Decorators" target="_blank"&gt;http://projects.unbit.it/uwsgi/wiki/Decorators&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Vamos ao que interessa.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Para instalar, &lt;strong&gt;pip install django-uwsgi-mail&lt;/strong&gt; ou baixe o reposit&amp;oacute;rio em &lt;a href="https://github.com/jaysonsantos/django-uwsgi-mail" target="_blank"&gt;https://github.com/jaysonsantos/django-uwsgi-mail&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Para us&amp;aacute;-lo, adicione o uwsgi_mail ao seu python path, e configure no seu settings o backend de e-mail com &lt;strong&gt;EMAIL_BACKEND = 'uwsgi_mail.uwsgi.EmailBackend'&lt;/strong&gt;, n&amp;atilde;o esquecendo de ativar o spooler no seu uWSGI e fazer com que ele carrege o m&amp;oacute;dulo &lt;strong&gt;uwsgi_mail.task&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;- Que mais, tio?&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;- Nada, envie seus e-mails.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;- Como assim?&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;- Com o backend adicionado, voc&amp;ecirc; pode usar tanto o send_mail ou EmailMessage normalmente que o backend ir&amp;aacute; serializar a mensagem e enviar para o uWSGI que enviar&amp;aacute; para o spool e o spool voltar&amp;aacute; ao uwsgi_mail.task.send_mail que usar&amp;aacute; por padr&amp;atilde;o o backend de SMTP do Django, caso voc&amp;ecirc; queria alter&amp;aacute;-lo, no seu settings, configure &lt;strong&gt;UWSGI_EMAIL_BACKEND&lt;/strong&gt; com o backend que voc&amp;ecirc; quiser.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;Eacute; isso a&amp;iacute;, fa&amp;ccedil;am fork do projeto, modifiquem, comentem.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;Mais informa&amp;ccedil;&amp;otilde;s em &lt;a href="https://github.com/jaysonsantos/django-uwsgi-mail" target="_blank"&gt;https://github.com/jaysonsantos/django-uwsgi-mail&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/e9Mlo7fuHdFQsyyEe0eDuGsfvdo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/e9Mlo7fuHdFQsyyEe0eDuGsfvdo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/e9Mlo7fuHdFQsyyEe0eDuGsfvdo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/e9Mlo7fuHdFQsyyEe0eDuGsfvdo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/kerov/django/~4/xMjEgAirzWQ" height="1" width="1"/&gt;</description><pubDate>Wed, 19 Oct 2011 21:55:00 -0200</pubDate><guid isPermaLink="false">http://www.kerov.com/tutoriais-t/tutorial/usando-o-uwsgi-para-enfileirar-seus-e-mails-com-django.html</guid><feedburner:origLink>http://www.kerov.com/tutoriais-t/tutorial/usando-o-uwsgi-para-enfileirar-seus-e-mails-com-django.html</feedburner:origLink></item></channel></rss>

