Jquery, Redirects and Django

Whenever Jquery performs an ajax call and the response has a 302 HTTP Status (redirect), the redirection is not performed.

The response is handled by Jquery as it had a HTTP 200 status code, and that’s just not right !

I had this problem with an ajax login box:

  • If username and password dont check, the server sends html, that goes to the login div.
  • When login is performed, server sends a redirect response that points to a private page.

The usual solution is to send a reponse with a made up status code (usually 278), check it and handle the redirection yourself.

$(document).ready(function() {
    $('body').ajaxComplete(function(e, xhr, settings) {
        if (xhr.status == 278) {
            window.location.href = xhr.getResponseHeader("Location").replace(/\?.*$/, "?next="+window.location.pathname);
        }
    });
});

To solve this problem with django, you can create a middleware that changes the status code from redirects performed from ajax requests:

from django.http import HttpResponseRedirect
 
class AjaxRedirect(object):
    def process_response(self, request, response):
        if request.is_ajax():
            if type(response) == HttpResponseRedirect:
                response.status_code = 278
        return response

Python e Django no TextMate

Assim como muitos outros usuários de Mac OSX o TextMate é meu editor de textos favorito. Ele é leve, confiável e torna a atividade de programar muito mais prazerosa. Na minha opinião ele só tem duas desvantagens: é pago (U$58) e funciona apenas no Mac OSX (sinto falta dele em outros OSs).

Nesse post vou mostrar como configurá-lo para trabalhar com Python e Django, em uma outra oportunidade, tentarei focar em dicas mais genéricas.

Antes de instalar qualquer tema ou bundle é necessário definir o encoding da sua máquina no seu arquivo ~/.bash_profile, basta adicionar essa linha:

export LC_CTYPE=pt_BR.UTF-8

Temas:

Primeiramente vamos configurar a aparência do TextMate, isso é feito através de temas. É necessário criar a pasta em que os temas do usuário são armazenados:

mkdir -p /Library/Application\ Support/TextMate/Bundles
cd /Library/Application\ Support/TextMate/Bundles

Com a pasta criada basta copiar os arquivos de temas e reiniciar o textmate com o comando:

osascript -e 'tell app "TextMate" to reload bundles'

Recomendo a criação de alguns alias para as tarefas mais comuns:

function tm-restart { osascript -e 'tell app "TextMate" to reload bundles'; };
alias tm-bundles="cd /Library/Application\ Support/TextMate/Bundles/"
alias tm-themes="cd /Library/Application\ Support/TextMate/Themes/"

Você pode achar temas legais aqui ou na wiki do textmate. O meu favorito é o Monokai

Bundles

Hightlight e outros

Basta instalar o bundle do Django e um melhorado do python.

Para não ficar perdido nos primeiros dias vale usar essa cheat sheet para python/django/rst

Auto complete com Rope

O bundle RopeMate utiliza a biblioteca Rope para adiconar recursos de autocomplete e refatoração. Os que mais uso são:

  • Auto complete: <control> + <space>
  • Organizar imports: <shift> + <cmd> + O
  • Ir para a declaração (do método ou classe): <cmd> + F3
  • Extrair linhas para método: <cmd> + <return>

Para instalar:

easy_install rope
cd ~/Library/Application\ Support/TextMate/Bundles/
git clone https://github.com/JulianEberius/RopeMate.tmbundle.git
tm-restart

Debug

O TextMate já possui um atalho para executar o script python com um terminal do pdb aberto: + + D. Porém, podemos melhorar essa integração, realçando a linha que está sendo debugada na janela do textmate.

sudo easy_install PdbTextMateSupport
mate ~/.pdbrc

Adicione as seguintes linhas:

from PdbTextMateSupport import preloop, precmd
pdb.Pdb.preloop = preloop
pdb.Pdb.precmd = precmd

Habilite o suporte marcando a opção “Highlight current line” no TextMate e executando o seguinte comando:

pdbtmsupport enable

Podcasts: Tecnologia

Em 2008, ano que entrei na UNIRIO eu passava 4 horas diárias em um ônibus e felizmente foi ano em que descobri o Podcast, uma excelente maneira de se manter informado e entretido por áudio.

A definição que costumo dar a meus amigos é: “Se trata de uma espécie de programa de rádio, feito por blogueiros e distribuído em mp3”. É muito mais do que isso, mas a idéia é mais ou menos essa.

Existem temas para todos os gostos: humor, variedades, ensino de idiomas, notícias, discussões técnicas, etc.

Ao rechear seu dispositivo tocador de mp3 de podcasts, suas horas de atividade física/trânsito/trabalho/whatever passam a ser mais prazerosas, engraçadas e informativas.

Nesse post falarei sobre meus podcasts favoritos sobre tecnologia, nos próximos abordarei os de humor e variedades:

The Dev Show: Meu favorito quando o assunto é tecnologia, apesar dos hosts serem rubystas, abordam todos os assuntos relacionados a desenvolvimento e sempre aparecem com links para verdadeiras pérolas do github.

Grok Podcast: Excelente podcast, episódios de duração média, excelentes temas e convidados.

AndroidCast:Podcast nacional sobre android, o áudio ainda não está perfeito mas definitivamente vale pelo conteúdo.

Papo Tech: Um dos mais antigos no brasil, não se aprofunda muito e pode ser considerado um podcast feito por leigos, porém é bem engraçado e costuma trazer algumas dicas bem legais.

DatabaseCast: Podcast brasileiro sobre banco de dados, áudio bem legal e excelente conteúdo.

Guanacast: Trata de diversos assuntos, sempre com muito humor.

Simples Ideias: um podcast curto com notícias interessantes para desenvolvedores.

Flask: uma microframework web para Python

É comum que cada linguagem possua uma ou mais frameworks web que sejam encaradas como “balas de prata”, com excelente documentação, extensões, comunidade ativa, etc …

Em python possuímos Django, web2py e Zope. Cada um com suas vantagens e desvantagens, e o Django com a maior fatia de usuários, esse que vos fala incluso.
Apesar do Django ser excelente, ele possui suas desvantagens e sabemos que não existe bala de prata.

Recentemente tive algumas idéias para projetos bem pequenos, e resolvi procurar alguma framework que fosse mais simples, foi aí que encontrei o Flask.

Flask is a microframework for Python based on Werkzeug, Jinja 2 and good intentions. And before you ask: It’s BSD licensed!

O código fonte é pequeno, simples e bem escrito. Inclusive, Flask possui mais linhas de documentação do que código.

Não temos um ORM, e uma série de outras facilidades comuns em outras frameworks. Na verdade, não temos quase nada e issó é ótimo. Ao desenvolver como uma microframework, cresci como programador. Tive a oportunidade de desenvolver minhas próprias soluções para problemas comuns em desenvolvimento web, compreendendo melhor os conceitos e chegando em resultados mais adequados para meu projeto.

Não vou me alongar muito nem mostrar code snippets, como falei, a documentação é ótima. Com esse post quero apenas plantar essa idéia: Tente algo diferente, volte ao básico, e não mate formigas com uma bazuca.