<?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>Chronosbox &#187; python</title>
	<atom:link href="http://chronosbox.org/blog/categories/python/feed" rel="self" type="application/rss+xml" />
	<link>http://chronosbox.org/blog</link>
	<description>idéias e dicas de uma mente insana trabalhando com TI</description>
	<lastBuildDate>Mon, 10 May 2010 03:09:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>pt</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JSONResponse &#8211; Trabalhando com JSON em Django, o jeito fácil.</title>
		<link>http://chronosbox.org/blog/jsonresponse-in-django</link>
		<comments>http://chronosbox.org/blog/jsonresponse-in-django#comments</comments>
		<pubDate>Wed, 14 Apr 2010 03:40:22 +0000</pubDate>
		<dc:creator>Felipe 'chronos' Prenholato</dc:creator>
				<category><![CDATA[Apps e extensões]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://chronosbox.org/blog/?p=294</guid>
		<description><![CDATA[Existem por ai dezenas de artigos e snippets sobre como trabalhar com 	JSON
 em Django, entretanto vi que a maioria é um pouco vaga e a solução envolve serializar com simplejson e mandar para o HttpResponse. Existem alguns detalhes que normalmente não se cobrem e eu apresento a maneira fácil de trabalhar e um exemplo [...]]]></description>
			<content:encoded><![CDATA[<p>Existem por ai dezenas de artigos e snippets sobre como trabalhar com 	<a href="http://www.json.org/">JSON</a><br />
 em <a href="http://www.djangoproject.com/">Django</a>, entretanto vi que a maioria é um pouco vaga e a solução envolve serializar com simplejson e mandar para o HttpResponse. Existem alguns detalhes que normalmente não se cobrem e eu apresento a maneira fácil de trabalhar e um exemplo funcional de JSON em um formulário.<br />
<span id="more-294"></span></p>
<h3> :: Problemas comuns ::</h3>
<p>Os problemas mais comuns que vejo ao trabalhar com JSON em qualquer lugar e não só em Django são:</p>
<ul>
<ol>1. Nem sempre é simples parsear os argumentos enviados</ol>
<ol>2. O simplejson da problemas com alguns tipos de objetos</ol>
<ol>3. Porque não termos um JSONResponse em vez de somente o HttpResponse <img src='http://chronosbox.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ?</ol>
</ul>
<h3>:: A solução ::</h3>
<ul>
<ol>1. Criar um JSON serializer que manipula objetos que dão problema ao simplejson.dumps</ol>
<ol>2. Criar a JSONResponse, baseada na HttpResponse e no nosso novo serializer</ol>
<ol>3. Achar um meio fácil de parsear os argumentos enviados para obter o JSON
</ul>
<p>A JSONResponse usa o JSON serializer e retorna uma response com os parâmetros enviados pela view. Os parâmetros são os objetos a serem serializados.</p>
<p>Definido isso vamos criar uma APP Django chamada jsonui <img src='http://chronosbox.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Ela tera 2 models, cidade e estado, 2 views, a main e a que retorna o json, um form simples e os arquivos response.py e utils.py com os métodos que usaremos para gerar o JSON bonitinho.</p>
<h4>:: O JSON serializer ::</h4>
<p>O serializer reside no utils, ele é divido em um JSONEncoder usado pelo simplejson que é responsável por interpretar os objetos que dariam problema, e no serializer propriamente dito que nada mais é um wrapper pro simplejson:</p>
<p class="file">Arquivo: <span class="name">jsonui/utils.py</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
</pre></td><td class="code"><pre class="python" style="font-family:monospace;color: #FCFFBA;"><span class="co1"># -*- coding: utf-8 -*-</span>
&nbsp;
<span class="kw1">from</span> django.<span class="me1">utils</span> <span class="kw1">import</span> simplejson
<span class="kw1">from</span> django.<span class="me1">utils</span>.<span class="me1">encoding</span> <span class="kw1">import</span> force_unicode
<span class="kw1">from</span> django.<span class="me1">db</span>.<span class="me1">models</span>.<span class="me1">base</span> <span class="kw1">import</span> ModelBase
&nbsp;
<span class="kw1">class</span> LazyJSONEncoder<span class="br0">&#40;</span>simplejson.<span class="me1">JSONEncoder</span><span class="br0">&#41;</span>:
    <span class="st0">&quot;&quot;&quot; a JSONEncoder subclass that handle querysets and models objects.
    Add how handle your type of object here to use when when dump json&quot;&quot;&quot;</span>
    <span class="kw1">def</span> default<span class="br0">&#40;</span><span class="kw2">self</span>,o<span class="br0">&#41;</span>:
        <span class="co1"># this handles querysets and other iterable types</span>
        <span class="kw1">try</span>:
            iterable = <span class="kw2">iter</span><span class="br0">&#40;</span>o<span class="br0">&#41;</span>
        <span class="kw1">except</span> <span class="kw2">TypeError</span>:
            <span class="kw1">pass</span>
        <span class="kw1">else</span>:
            <span class="kw1">return</span> <span class="kw2">list</span><span class="br0">&#40;</span>iterable<span class="br0">&#41;</span>
&nbsp;
        <span class="co1"># this handlers Models</span>
        <span class="kw1">try</span>:
            <span class="kw2">isinstance</span><span class="br0">&#40;</span>o.__class__,ModelBase<span class="br0">&#41;</span>
        <span class="kw1">except</span> <span class="kw2">Exception</span>:
            <span class="kw1">pass</span>
        <span class="kw1">else</span>:
            <span class="kw1">return</span> force_unicode<span class="br0">&#40;</span>o<span class="br0">&#41;</span>
&nbsp;
        <span class="kw1">return</span> <span class="kw2">super</span><span class="br0">&#40;</span>LazyJSONEncoder,<span class="kw2">self</span><span class="br0">&#41;</span>.<span class="me1">default</span><span class="br0">&#40;</span>obj<span class="br0">&#41;</span>
&nbsp;
<span class="kw1">def</span> serialize_to_json<span class="br0">&#40;</span>obj,<span class="sy0">*</span>args,<span class="sy0">**</span>kwargs<span class="br0">&#41;</span>:
    <span class="st0">&quot;&quot;&quot; A wrapper for simplejson.dumps with defaults as:
&nbsp;
    ensure_ascii=False
    cls=LazyJSONEncoder
&nbsp;
    All arguments can be added via kwargs
    &quot;&quot;&quot;</span>
&nbsp;
    kwargs<span class="br0">&#91;</span><span class="st0">'ensure_ascii'</span><span class="br0">&#93;</span> = kwargs.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">'ensure_ascii'</span>,<span class="kw2">False</span><span class="br0">&#41;</span>
    kwargs<span class="br0">&#91;</span><span class="st0">'cls'</span><span class="br0">&#93;</span> = kwargs.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">'cls'</span>,LazyJSONEncoder<span class="br0">&#41;</span>
&nbsp;
&nbsp;
    <span class="kw1">return</span> simplejson.<span class="me1">dumps</span><span class="br0">&#40;</span>obj,<span class="sy0">*</span>args,<span class="sy0">**</span>kwargs<span class="br0">&#41;</span></pre></td></tr></table></div>

<h4>:: A JSONResponse ::</h4>
<p>A JSONResponse reside no response, basicamente ela recebe a lista, dicionário ou qualquer objeto que você envia para o JSONResponse e retorna serializado:</p>
<p class="file">Arquivo: <span class="name">jsonui/response.py</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="python" style="font-family:monospace;color: #FCFFBA;"><span class="co1"># -*- coding: utf-8 -*-</span>
&nbsp;
<span class="kw1">from</span> utils <span class="kw1">import</span> serialize_to_json
<span class="kw1">from</span> django.<span class="me1">http</span> <span class="kw1">import</span> HttpResponseForbidden, HttpResponse
&nbsp;
<span class="kw1">class</span> JSONResponse<span class="br0">&#40;</span>HttpResponse<span class="br0">&#41;</span>:
    <span class="st0">&quot;&quot;&quot; JSON response class &quot;&quot;&quot;</span>
    <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,content=<span class="st0">''</span>,json_opts=<span class="br0">&#123;</span><span class="br0">&#125;</span>,mimetype=<span class="st0">&quot;application/json&quot;</span>,<span class="sy0">*</span>args,<span class="sy0">**</span>kwargs<span class="br0">&#41;</span>:
        <span class="st0">&quot;&quot;&quot;
        This returns a object that we send as json content using 
        utils.serialize_to_json, that is a wrapper to simplejson.dumps
        method using a custom class to handle models and querysets. Put your
        options to serialize_to_json in json_opts, other options are used by
        response.
        &quot;&quot;&quot;</span>
        <span class="kw1">if</span> content:
            content = serialize_to_json<span class="br0">&#40;</span>content,<span class="sy0">**</span>json_opts<span class="br0">&#41;</span>
        <span class="kw1">else</span>:
            content = serialize_to_json<span class="br0">&#40;</span><span class="br0">&#91;</span><span class="br0">&#93;</span>,<span class="sy0">**</span>json_opts<span class="br0">&#41;</span>
        <span class="kw2">super</span><span class="br0">&#40;</span>JSONResponse,<span class="kw2">self</span><span class="br0">&#41;</span>.<span class="kw4">__init__</span><span class="br0">&#40;</span>content,mimetype,<span class="sy0">*</span>args,<span class="sy0">**</span>kwargs<span class="br0">&#41;</span></pre></td></tr></table></div>

<h4>:: Botando pra funcionar na view. ::</h4>
<p>Sem mais rodeios, vamos ver como funciona. Nós temos duas views:</p>
<ul>
<li><em>mainview</em>: chama o form e renderiza um template com o código javascript necessário para executar o POST e renderizar o JSON que obtemos como resposta.</li>
<li><em>json_get_city</em>: responsável por retornar as cidades de acordo com o estado enviado.</li>
</ul>
<p></p>
<p class="file">Arquivo: <span class="name">urls.py</span> <span class="line">@ 17</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
</pre></td><td class="code"><pre class="python" style="font-family:monospace;color: #FCFFBA;"><span class="br0">&#40;</span>r<span class="st0">'^$'</span>,<span class="st0">'jsonui.views.mainview'</span><span class="br0">&#41;</span>,
<span class="br0">&#40;</span>r<span class="st0">'^ajax/city/'</span>,<span class="st0">'jsonui.views.json_get_city'</span><span class="br0">&#41;</span>,</pre></td></tr></table></div>

<p class="file">Arquivo: <span class="name">jsonui/views.py</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="python" style="font-family:monospace;color: #FCFFBA;"><span class="co1"># -*- coding: utf-8 -*-</span>
&nbsp;
<span class="kw1">from</span> django.<span class="me1">shortcuts</span> <span class="kw1">import</span> render_to_response
<span class="kw1">from</span> django.<span class="me1">template</span> <span class="kw1">import</span> RequestContext
&nbsp;
&nbsp;
<span class="kw1">from</span> models <span class="kw1">import</span> City,State
<span class="kw1">from</span> forms <span class="kw1">import</span> CityForm
&nbsp;
<span class="kw1">from</span> utils <span class="kw1">import</span> qdct_as_kwargs
<span class="kw1">from</span> response <span class="kw1">import</span> JSONResponse
&nbsp;
<span class="kw1">def</span> mainview<span class="br0">&#40;</span>request<span class="br0">&#41;</span>:
&nbsp;
    <span class="kw1">return</span> render_to_response<span class="br0">&#40;</span><span class="st0">'base.html'</span>,<span class="br0">&#123;</span><span class="st0">'form'</span>: CityForm<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#125;</span>,
        context_instance=RequestContext<span class="br0">&#40;</span>request<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="kw1">def</span> json_get_city<span class="br0">&#40;</span>request<span class="br0">&#41;</span>:
&nbsp;
    <span class="kw1">if</span> <span class="kw1">not</span> request.<span class="me1">method</span> == <span class="st0">&quot;POST&quot;</span>:
        <span class="co1"># return all cities if any filter was send</span>
        <span class="kw1">return</span> JSONResponse<span class="br0">&#40;</span>City.<span class="me1">objects</span>.<span class="me1">order_by</span><span class="br0">&#40;</span><span class="st0">'name'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
    <span class="co1"># get cities with request.POST as filter arguments</span>
    cities = City.<span class="me1">objects</span>.<span class="kw2">filter</span><span class="br0">&#40;</span><span class="sy0">**</span>qdct_as_kwargs<span class="br0">&#40;</span>request.<span class="me1">POST</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">order_by</span><span class="br0">&#40;</span><span class="st0">'name'</span><span class="br0">&#41;</span>
&nbsp;
    <span class="co1">#return JSONResponse with id and name</span>
    <span class="kw1">return</span> JSONResponse<span class="br0">&#40;</span>cities.<span class="me1">values</span><span class="br0">&#40;</span><span class="st0">'id'</span>,<span class="st0">'name'</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></td></tr></table></div>

<p>O método <em>qdct_as_kwargs</em> é responsável por retornar um dicionário que é passado parao método filter de um objeto a partir do request.POST ou request.GET. É uma magica legal que agiliza e muito a criação de views como essa.</p>
<p>Assim que a url /ajax/city/ recebe o POST ela obtem as cidades usando o <em>qdct_as_kwargs</em> e retorna a <em>JSONResponse</em>, no javascript a resposta é um JSON pronto para usar.</p>
<p class="file">Arquivo: <span class="name">jsonui/utils.py</span> <span class="line">@ 44</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>44
45
46
47
48
</pre></td><td class="code"><pre class="python" style="font-family:monospace;color: #FCFFBA;"><span class="kw1">def</span> qdct_as_kwargs<span class="br0">&#40;</span>qdct<span class="br0">&#41;</span>:
kwargs=<span class="br0">&#123;</span><span class="br0">&#125;</span>
<span class="kw1">for</span> k,v <span class="kw1">in</span> qdct.<span class="me1">items</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:
    kwargs<span class="br0">&#91;</span><span class="kw2">str</span><span class="br0">&#40;</span>k<span class="br0">&#41;</span><span class="br0">&#93;</span>=v
<span class="kw1">return</span> kwargs</pre></td></tr></table></div>

<p>O javascript responsável por mandar o POST esta no template <em>base.html</em> que é renderizado pela <em>mainview</em>. Este é o trecho relevante:</p>
<p class="file">Arquivo: <span class="name">templates/base.html</span> <span class="line">@ 10</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;color: #FCFFBA;">$<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
    $<span class="br0">&#40;</span><span class="st0">&quot;#id_state&quot;</span><span class="br0">&#41;</span>.<span class="me1">change</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span>
        $.<span class="me1">post</span><span class="br0">&#40;</span>
            <span class="co1">// url to post</span>
            <span class="st0">&quot;/ajax/city/&quot;</span><span class="sy0">,</span>
            <span class="co1">// args</span>
            <span class="br0">&#123;</span>state__id<span class="sy0">:</span>$<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="sy0">,</span>
            <span class="co1">// response callback</span>
            <span class="kw2">function</span><span class="br0">&#40;</span>data<span class="sy0">,</span>text<span class="sy0">,</span>xhrobject<span class="br0">&#41;</span><span class="br0">&#123;</span>
                <span class="co1">// uncomment if you wanna to see objects on firebug console</span>
                <span class="co1">//console.log(data,text,xhrobject)</span>
                $<span class="br0">&#40;</span><span class="st0">&quot;#id_city&quot;</span><span class="br0">&#41;</span>.<span class="me1">children</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">remove</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
                    .<span class="me1">append</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;option selected=<span class="es0">\&quot;</span>selected<span class="es0">\&quot;</span> value=<span class="es0">\&quot;</span><span class="es0">\&quot;</span>&gt;------&lt;/option&gt;&quot;</span><span class="br0">&#41;</span>
                <span class="kw1">for</span> <span class="br0">&#40;</span>i <span class="kw1">in</span> data<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                    i <span class="sy0">=</span> data<span class="br0">&#91;</span>i<span class="br0">&#93;</span>
                    $<span class="br0">&#40;</span><span class="st0">&quot;#id_city&quot;</span><span class="br0">&#41;</span>.<span class="me1">append</span><span class="br0">&#40;</span>
                        <span class="st0">&quot;&lt;option value=<span class="es0">\&quot;</span>&quot;</span><span class="sy0">+</span>i.<span class="me1">id</span><span class="sy0">+</span><span class="st0">&quot;<span class="es0">\&quot;</span>&gt;&quot;</span><span class="sy0">+</span>i.<span class="kw3">name</span><span class="sy0">+</span><span class="st0">&quot;&lt;/option&gt;&quot;</span>
                    <span class="br0">&#41;</span>
                <span class="br0">&#125;</span>
            <span class="br0">&#125;</span><span class="br0">&#41;</span>
    <span class="br0">&#125;</span><span class="br0">&#41;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span></pre></td></tr></table></div>

<p>Este código executa um POST para /ajax/city/ e na volta preenche o select de cidades com o objeto retornado.</p>
<h3>:: Finalizando ::</h3>
<p>Reproduzindo javascripts similares e usando o qdct_as_kwargs e o JSONResponse como usado na view <em>json_get_city</em> você pode facílmente criar várias views ou até uma view mais genérica que pegue de qualquer modelo. Basta deixar a imaginação fluir <img src='http://chronosbox.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>Você pode baixar o projeto completo aqui: <a href="http://files.chronosbox.org/jsonproject.tbz2">jsonproject.tbz2</a> (<a href="http://files.chronosbox.org/jsonproject.tbz2.md5">MD5 Hash</a>) (<a href="http://chronosbox.org/jsonproject.tbz2">mirror</a>, <a href="http://chronosbox.org/jsonproject.tbz2.md5">mirror MD5</a>)</p>
<p>Eu construi ele usando Django 1.2, mas roda em qualquer versão acima da 1.0.</p>
<p>Divirta-se, contribua, comente <img src='http://chronosbox.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://chronosbox.org/blog/jsonresponse-in-django/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Vim confs prontas para trabalhar com Python e Django</title>
		<link>http://chronosbox.org/blog/read-to-work-vim-confs-for-python-and-django</link>
		<comments>http://chronosbox.org/blog/read-to-work-vim-confs-for-python-and-django#comments</comments>
		<pubDate>Sun, 07 Mar 2010 09:59:44 +0000</pubDate>
		<dc:creator>Felipe 'chronos' Prenholato</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[VIM - Vi IMproveded]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Colorscheme]]></category>
		<category><![CDATA[completion]]></category>
		<category><![CDATA[fold]]></category>
		<category><![CDATA[jump]]></category>
		<category><![CDATA[manager]]></category>
		<category><![CDATA[matchit]]></category>
		<category><![CDATA[omni]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[snipmate]]></category>
		<category><![CDATA[vimrc]]></category>
		<category><![CDATA[wombat]]></category>

		<guid isPermaLink="false">http://chronosbox.org/blog/?p=280</guid>
		<description><![CDATA[Este fim de semana eu reescrevi meu .vimrc e gastei um tempo extra para fazer
as coisas funcionarem melhores para mim com python e django  . Eu acabei
fazendo um belo trabalho e agora estou codando com muito mais eficiência.
Os resultados são:

 Um .vimrc muito bem comentado e com muitas customizações.
 Suporte para python omnicomplete.
 Adição [...]]]></description>
			<content:encoded><![CDATA[<p>Este fim de semana eu reescrevi meu .vimrc e gastei um tempo extra para fazer<br />
as coisas funcionarem melhores para mim com python e django <img src='http://chronosbox.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Eu acabei<br />
fazendo um belo trabalho e agora estou codando com muito mais eficiência.</p>
<p>Os resultados são:</p>
<ul>
<li> Um .vimrc muito bem comentado e com muitas customizações.</li>
<li> Suporte para python omnicomplete.</li>
<li> Adição dos paths python e django automáticos ao ambiente do vim.</li>
<li> Adição da DJANGO_SETTINGS_MODULE automaticamente ao ambiente do vim, para completar seu próprio código.</li>
<li> Suporte do SnipMate para código django e django templates.</li>
<li> Django templates com suporte para highlighting das tags e uso do &#8216;%&#8217; com o plugin matchit.</li>
<li> Python folding e suporte a python jumping.</li>
<li> O tema acinzentado wombat com algumas customizações minhas.</li>
<li> Um gerenciador de sessões para o Vim para facilitar sua vida em manter o ambiente de trabalho.</li>
</ul>
<p>Aqui estão os arquivos para download:</p>
<ul>
<li> <a href="http://chronosbox.org/vimconfs/vim-confs-latest.tbz2">vim-confs-latest.tbz2</a>: O arquivo tar compactado com todos os arquivos, descompacte na sua home.</li>
<li> <a href="http://chronosbox.org/vimconfs/vim-confs-latest.tbz2.md5">vim-confs-latest.tbz2.md5</a>: O md5sum do tar.</li>
</ul>
<p>Se você preferir, este é o endereço no github: <a href="http://github.com/chronossc/my-vim-confs">http://github.com/chronossc/my-vim-confs</a></p>
<p>O pacote não poderia ter sido criado sem alguns plugins e artigos, segue a referência:</p>
<ul>
<li> <a href="http://code.djangoproject.com/wiki/UsingVimWithDjango" target="_blank">UsingVimWithDjango do Django Wiki</a></li>
<li> <a href="http://www.vim.org/scripts/script.php?script_id=2540" target="_blank">SnipMate vim plugin por Michael Sanders</a></li>
<li> <a href="http://github.com/robhudson/snipmate_for_django" target="_blank">SnipMate snippets for django por Rob Hudson</a> <a href="http://rob.cogit8.org/blog/2009/Sep/20/using-vim-and-snipmate-django/" target="_blank">(Demo)</a></li>
<li> <a href="http://www.vim.org/scripts/script.php?script_id=39" target="_blank">Matchit vim plugin por Benji Fisher</a></li>
<li> <a href="http://www.vim.org/scripts/script.php?script_id=1487" target="_blank">Updated Syntax highlighting for Django templates por Dave Hodder</a></li>
<li> <a href="http://www.vim.org/scripts/script.php?script_id=1487" target="_blank">py_jump vim plugin por Sergiy Matusevych</a></li>
<li> <a href="http://www.vim.org/scripts/script.php?script_id=1487" target="_blank">python fold vim plugin por Jorrit Wiersma</a></li>
<li> <a href="http://www.vim.org/scripts/script.php?script_id=2010" target="_blank">Session Manager for vim por Yuri Klubakov</a>
</ul>
<p>Adicionalmente (thx Handrus), eu sugiro para quem escreve muito HTML, dar uma olhada no <a href="http://jetpackweb.com/blog/2010/03/04/write-html-faster-with-sparkup-vim-and-textmate/" target="_blank">SparkUp vim and textmate plugin</a> <img src='http://chronosbox.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Eu não testei, mas pareceu muito bom.</p>
<p>Muito obrigado a quem ler, a todos que escreveram os plugins, ao pessoal do canal #vim na freenode e a ótima documentação do vim!<br />
Agora bora codar com o vim <img src='http://chronosbox.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>** Atualizado<br />
2010-03-07: Eu criei novamente o tar porque eu removi algumas mensagens de debug, então faça o download novamente se você já fez <img src='http://chronosbox.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
2010-03-09: Eu criei novamente o tar, fiz alguns fixes e adicionei no github.</p>
]]></content:encoded>
			<wfw:commentRss>http://chronosbox.org/blog/read-to-work-vim-confs-for-python-and-django/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Configurando múltiplos ambientes Python</title>
		<link>http://chronosbox.org/blog/setting-up-multiple-python-envrionments</link>
		<comments>http://chronosbox.org/blog/setting-up-multiple-python-envrionments#comments</comments>
		<pubDate>Wed, 27 Jan 2010 02:20:01 +0000</pubDate>
		<dc:creator>Felipe 'chronos' Prenholato</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[2.4]]></category>
		<category><![CDATA[2.5]]></category>
		<category><![CDATA[2.6]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[versions]]></category>

		<guid isPermaLink="false">http://chronosbox.org/blog/?p=259</guid>
		<description><![CDATA[Múltiplos ambientes python
Trabalhar com várias versões de ambientes python tem se tornado algo comum em minha vida, e acredito que um meio fácil de &#8217;setar&#8217; estes ambientes seja algo útil e  não tão simples para a maioria das pessoas.
Eu criei um simples bash script que seta este &#8216;ambiente&#8217;, trata-se de uma função que você [...]]]></description>
			<content:encoded><![CDATA[<h3>Múltiplos ambientes python</h3>
<p>Trabalhar com várias versões de ambientes python tem se tornado algo comum em minha vida, e acredito que um meio fácil de &#8217;setar&#8217; estes ambientes seja algo útil e  não tão simples para a maioria das pessoas.</p>
<p>Eu criei um simples bash script que seta este &#8216;ambiente&#8217;, trata-se de uma função que você cria no seu <em><strong>.bash_profile</strong></em>. Executa-se ela com a versão do python em seguida e pronto, seu ambiente esta configurado. Vamos ver no código como eu fiz, o script está com comentários em inglês:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: #FCFFBA;"><span class="kw3">export</span> <span class="re2">ORIGINALPATH</span>=<span class="re1">$PATH</span>
loadpyenv<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
    <span class="co0"># $PV is our control variable, get from $1, first argument on shell</span>
    <span class="co0"># anything that you need to put here and depend for python version ${PV} is your var ;)</span>
    <span class="kw3">export</span> <span class="re2">PV</span>=$<span class="nu0">1</span>
    <span class="kw3">echo</span> <span class="re5">-e</span> <span class="st0">&quot;<span class="es1">\n</span>:: Setting environ to use python <span class="es2">$PV</span>&quot;</span>
&nbsp;
    <span class="co0"># Put here various aliases that you can use</span>
    <span class="co0"># put a python alias</span>
    <span class="kw3">alias</span> <span class="re2">python</span>=<span class="st0">&quot;python<span class="es3">${PV}</span>&quot;</span>
    <span class="co0"># m and runserver a kick alias for Django common actions</span>
    <span class="kw3">alias</span> <span class="re2">m</span>=<span class="st0">&quot;python<span class="es3">${PV}</span> manage.py&quot;</span>
    <span class="kw3">alias</span> <span class="re2">runserver</span>=<span class="st0">&quot;python<span class="es3">${PV}</span> manage.py runserver :8000&quot;</span>
    <span class="co0"># easy and fast install of python packages, in right path with localpyinstall</span>
    <span class="kw3">alias</span> <span class="re2">localpyinstall</span>=<span class="st0">&quot;python<span class="es3">${PV}</span> setup.py install --prefix=~/.py/<span class="es3">${PV}</span>/&quot;</span>
    <span class="kw3">echo</span> <span class="re5">-e</span> <span class="st0">&quot;<span class="es1">\n</span>:: New aliases&quot;</span>
    <span class="co0"># print aliases :)</span>
    <span class="kw3">alias</span> python m runserver localpyinstall
&nbsp;
    <span class="kw3">echo</span> <span class="re5">-e</span> <span class="st0">&quot;<span class="es1">\n</span>:: New PATH&quot;</span>
    <span class="co0"># setup aplications path, be careful about not use $ORIGINALPATH.</span>
    <span class="co0">#</span>
    <span class="co0"># I use a path structure like that:</span>
    <span class="co0"># ~/.py/</span>
    <span class="co0"># |-- 2.4</span>
    <span class="co0"># |-- 2.5</span>
    <span class="co0"># `-- 2.6</span>
    <span class="kw3">export</span> <span class="re2">PATH</span>=<span class="st0">&quot;<span class="es3">${HOME}</span>/.py/<span class="es3">${PV}</span>/bin/:<span class="es3">${ORIGINALPATH}</span>&quot;</span>
    <span class="kw3">echo</span> <span class="re1">$PATH</span>
    <span class="kw3">echo</span> <span class="re5">-e</span> <span class="st0">&quot;<span class="es1">\n</span>:: New PYTHON PATH&quot;</span>
    <span class="co0"># setup new python path, don't need to add system wide path, just our custom paths</span>
    <span class="kw3">export</span> <span class="re2">PYTHONPATH</span>=<span class="st0">&quot;<span class="es3">${HOME}</span>/.py/<span class="es3">${PV}</span>/lib/python<span class="es3">${PV}</span>/site-packages/&quot;</span>
    <span class="co0"># print more some info</span>
    python<span class="re1">$PV</span> <span class="re5">-c</span> <span class="st0">&quot;import sys;print sys.path&quot;</span>
    <span class="kw3">echo</span> <span class="re5">-e</span> <span class="st0">&quot;<span class="es1">\n</span>:: Django version &amp;amp; file&quot;</span>
    python<span class="re1">$PV</span> <span class="re5">-c</span> <span class="st0">&quot;import django;print 'version %s ... file %s' % (django.get_version(),django.__file__);&quot;</span>
<span class="br0">&#125;</span></pre></div></div>

<p>Agora crie uma estrutura de diretórios com o comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: #FCFFBA;">$ <span class="kw2">mkdir</span> <span class="re5">-pv</span> ~<span class="sy0">/</span>.py<span class="sy0">/</span><span class="br0">&#123;</span><span class="nu0">2.4</span>,<span class="nu0">2.5</span>,<span class="nu0">2.6</span><span class="br0">&#125;</span></pre></div></div>

<p>E cada vez que for usar uma versão diferente do python, carregue com:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: #FCFFBA;">$ loadpyenv VERSÃO</pre></div></div>

<p>Onde VERSÃO é a versão escolhida do python.</p>
<h3>Várias versões do Python no <a href="http://www.gentoo.org">Gentoo</a></h3>
<p>O <a href="http://www.gentoo.org">Gentoo Linux</a>, minha distro do dia a dia, me dá um bom bonus quanto a múltiplas versões do python, configure no /etc/make.conf a seguinte linha:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: #FCFFBA;"><span class="re2">USE_PYTHON</span>=<span class="st0">&quot;2.4 2.5 2.6&quot;</span></pre></div></div>

<p>Instale os pythons nas versões escolhidas e execute o seguinte comando para re-compilar seus pacotes:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: #FCFFBA;">emerge $<span class="br0">&#40;</span>eix <span class="re5">-I</span> dev-python<span class="sy0">/*</span> <span class="sy0">|</span> <span class="kw2">grep</span> <span class="st0">&quot;\[I\]&quot;</span> <span class="sy0">|</span> <span class="kw2">cut</span> <span class="re5">-d</span><span class="st_h">' '</span> -f2<span class="br0">&#41;</span></pre></div></div>

<p><em>O <strong>eix</strong> é uma aplicação de indexação do portage, muito comum nas máquinas Gentoo.</em></p>
<p>Cada pacote python é recompilado para as 3 versões (no caso), mas tive problemas em compilar alguns pacotes para a 2.4, fiquem avisados <img src='http://chronosbox.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bom, é isso, até mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://chronosbox.org/blog/setting-up-multiple-python-envrionments/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
