<?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>GustavoHenrique.net &#187; cache</title>
	<atom:link href="http://blog.gustavohenrique.net/tag/cache/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gustavohenrique.net</link>
	<description>Tecnologia e Software Livre</description>
	<lastBuildDate>Mon, 05 Mar 2012 10:50:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Problema com cache do mod_wsgi</title>
		<link>http://blog.gustavohenrique.net/2009/01/problema-com-cache-do-mod_wsgi/</link>
		<comments>http://blog.gustavohenrique.net/2009/01/problema-com-cache-do-mod_wsgi/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 11:46:07 +0000</pubDate>
		<dc:creator>gustavohenrique</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[mod_wsgi]]></category>

		<guid isPermaLink="false">http://www.gustavohenrique.net/brogui/?p=67</guid>
		<description><![CDATA[Certo dia terminei um projeto em Django e após vários testes finalmente foi ao ar. Feito isso, liguei para o cliente e marcamos uma reunião para o dia seguinte. Na reunião, conversa vai, conversa vem, o sistema é exibido, tudo funcionando, cliente feliz, eu feliz, tudo ótimo e maravilhoso. Eis então que o cliente sugere [...]]]></description>
			<content:encoded><![CDATA[<p>Certo dia terminei um projeto em Django e após vários testes finalmente foi ao ar. Feito isso, liguei para o cliente e marcamos uma reunião para o dia seguinte. Na reunião, conversa vai, conversa vem, o sistema é exibido, tudo funcionando, cliente feliz, eu feliz, tudo ótimo e maravilhoso. Eis então que o cliente sugere uma pequena alteração: Alterar uma mensagem emitida ao usuário. Tarefa simples, pensei. Vou abrir o arquivo e alterar uma string. Pronto! Nada complicado ou demorado que exija marcar uma nova reunião para apresentar essa mudança. Em casa eu atualizo o arquivo e fica tudo como está. Erro meu ter pensado assim. Após a modificação ter sido feita, o sistema não quis atualizar por nada. Apertei Crtl+F5, limpei o cache do navegador, testei em outros navegadores&#8230; e nada. Só podia ser cache no servidor de hospedagem. Então deletei todos os .pyc e mesmo assim não funcionou. A coisa era do mal mesmo. <span id="more-67"></span><br />
Bom, expliquei ao cliente o que estava acontecendo e ganhei algum tempo para tentar resolver. Percebi que alterações feitas no código da aplicação não eram atualizadas em tempo real. Em outras palavras, se seu projeto já está no servidor de produção usando o mod_wsgi e você alterar o código de uma view ou model, a atualização não será refletida no exato momento.<br />
Não me aprofundei no assunto mas aparentemente o mod_wsgi provê um sistema de cache que leva horas para verificar se houve alterações no código da aplicação. De fato, essa é uma atitude inteligente, pois uma vez que o projeto está em ambiente de produção, nenhuma alteração deveria ser feita naquele espaço. As alterações deveriam ser feitas no ambiente de desenvolvimento e só depois de passar nos testes seria levada ao ambiente de produção.<br />
Então fui pedir ajuda ao oráculo (google) e, após algum tempo, encontrei um site contendo um script que me ajudou bastante naquele momento.</p>
<p>Crie um arquivo chamado monitor.py e ponha-o no diretório do projeto. Abaixo o conteúdo do arquivo:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">signal</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">threading</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">atexit</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">Queue</span>
&nbsp;
_interval = <span style="color: #ff4500;">1.0</span>
_times = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
_files = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
_running = <span style="color: #008000;">False</span>
_queue = <span style="color: #dc143c;">Queue</span>.<span style="color: #dc143c;">Queue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
_lock = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Lock</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> _restart<span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>:
  _queue.<span style="color: black;">put</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
  prefix = <span style="color: #483d8b;">'monitor (pid=%d):'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">getpid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #66cc66;">&amp;</span>gt<span style="color: #66cc66;">;&amp;</span>gt<span style="color: #66cc66;">;</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span>, <span style="color: #483d8b;">'%s Change detected to <span style="color: #000099; font-weight: bold;">\'</span>%s<span style="color: #000099; font-weight: bold;">\'</span>.'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>prefix, path<span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #66cc66;">&amp;</span>gt<span style="color: #66cc66;">;&amp;</span>gt<span style="color: #66cc66;">;</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span>, <span style="color: #483d8b;">'%s Triggering process restart.'</span> <span style="color: #66cc66;">%</span> prefix
  <span style="color: #dc143c;">os</span>.<span style="color: black;">kill</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">getpid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #dc143c;">signal</span>.<span style="color: black;">SIGINT</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> _modified<span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">try</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">isfile</span><span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>:
      <span style="color: #ff7700;font-weight:bold;">return</span> path <span style="color: #ff7700;font-weight:bold;">in</span> _times
&nbsp;
    mtime = <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">stat</span><span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>.<span style="color: black;">st_mtime</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> path <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> _times:
      _times<span style="color: black;">&#91;</span>path<span style="color: black;">&#93;</span> = mtime
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> mtime <span style="color: #66cc66;">!</span>= _times<span style="color: black;">&#91;</span>path<span style="color: black;">&#93;</span>:
      <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
  <span style="color: #ff7700;font-weight:bold;">except</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
  <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> _monitor<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #ff4500;">1</span>:
    <span style="color: #ff7700;font-weight:bold;">for</span> module <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">modules</span>.<span style="color: black;">values</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
      <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">hasattr</span><span style="color: black;">&#40;</span>module, <span style="color: #483d8b;">'__file__'</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">continue</span>
      path = <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span>module, <span style="color: #483d8b;">'__file__'</span><span style="color: black;">&#41;</span>
      <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> path:
        <span style="color: #ff7700;font-weight:bold;">continue</span>
      <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">splitext</span><span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span><span style="color: #483d8b;">'.pyc'</span>, <span style="color: #483d8b;">'.pyo'</span>, <span style="color: #483d8b;">'.pyd'</span><span style="color: black;">&#93;</span>:
        path = path<span style="color: black;">&#91;</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
      <span style="color: #ff7700;font-weight:bold;">if</span> _modified<span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> _restart<span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> path <span style="color: #ff7700;font-weight:bold;">in</span> _files:
      <span style="color: #ff7700;font-weight:bold;">if</span> _modified<span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> _restart<span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">try</span>:
      <span style="color: #ff7700;font-weight:bold;">return</span> _queue.<span style="color: black;">get</span><span style="color: black;">&#40;</span>timeout=_interval<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span>:
      <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
_thread = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Thread</span><span style="color: black;">&#40;</span>target=_monitor<span style="color: black;">&#41;</span>
_thread.<span style="color: black;">setDaemon</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> _exiting<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">try</span>:
    _queue.<span style="color: black;">put</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">except</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span>
  _thread.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #dc143c;">atexit</span>.<span style="color: black;">register</span><span style="color: black;">&#40;</span>_exiting<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> track<span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> path <span style="color: #ff7700;font-weight:bold;">in</span> _files:
    _files.<span style="color: black;">append</span><span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> start<span style="color: black;">&#40;</span>interval=<span style="color: #ff4500;">1.0</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">global</span> _interval
  <span style="color: #ff7700;font-weight:bold;">if</span> interval <span style="color: #66cc66;">&amp;</span>lt<span style="color: #66cc66;">;</span> _interval:
    _interval = interval
&nbsp;
  <span style="color: #ff7700;font-weight:bold;">global</span> _running
  _lock.<span style="color: black;">acquire</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> _running:
    prefix = <span style="color: #483d8b;">'monitor (pid=%d):'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">getpid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #66cc66;">&amp;</span>gt<span style="color: #66cc66;">;&amp;</span>gt<span style="color: #66cc66;">;</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span>, <span style="color: #483d8b;">'%s Starting change monitor.'</span> <span style="color: #66cc66;">%</span> prefix
    _running = <span style="color: #008000;">True</span>
    _thread.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  _lock.<span style="color: black;">release</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Para finalizar a configuração, altere o arquivo de configuração do mod_wsgi de modo a conter as duas últimas linhas do código abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>, <span style="color: #dc143c;">sys</span>
<span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/home/usuario/www/apps_wsgi'</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">os</span>.<span style="color: black;">environ</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'DJANGO_SETTINGS_MODULE'</span><span style="color: black;">&#93;</span>=<span style="color: #483d8b;">'meuprojeto.settings'</span>
<span style="color: #ff7700;font-weight:bold;">import</span> django.<span style="color: black;">core</span>.<span style="color: black;">handlers</span>.<span style="color: black;">wsgi</span>
application = django.<span style="color: black;">core</span>.<span style="color: black;">handlers</span>.<span style="color: black;">wsgi</span>.<span style="color: black;">WSGIHandler</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> meuprojeto.<span style="color: black;">monitor</span>
meuprojeto.<span style="color: black;">monitor</span>.<span style="color: black;">start</span><span style="color: black;">&#40;</span>interval=<span style="color: #ff4500;">1.0</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Feito isso as alterações no código serão atualizadas no navegador em tempo real.<br />
Lamento não inserir uma referência para o site do qual copiei o script, pois já faz algum tempo e não me lembro mais o nome nem a URL.</p>
<h2>Links Relacionados</h2>
<p><a href="http://blog.dscpl.com.au/2009/02/source-code-reloading-with-modwsgi-on.html">http://blog.dscpl.com.au/2009/02/source-code-reloading-with-modwsgi-on.html</a><br />
<a href="http://blog.dscpl.com.au/2008/12/using-modwsgi-when-developing-django.html">http://blog.dscpl.com.au/2008/12/using-modwsgi-when-developing-django.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gustavohenrique.net/2009/01/problema-com-cache-do-mod_wsgi/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

