Django + AJAX + JSON + Locaweb

144 views
Skip to first unread message

Daniel Gonçalves

unread,
Aug 2, 2010, 10:35:55 PM8/2/10
to django...@googlegroups.com
Tenho um view que é executado por uma chamada assíncrona (AJAX). Esse
view produz uma resposta (texto puro, basicamente) na sintaxe JSON
(RFC 4627). Em ambiente de desenvolvimento, funcionou OK. Em ambiente
de produção, instalado na Locaweb, com Django 1.1.1, quando este view
é invocado, está provocando um erro HTTP 500 (internal server error).
Vendo os logs, eu encontrei o seguinte::

[error] ... mod_mime_magic: invalid type 0 in mconvert()., referer:
http://www.example.com/get_autores/

(note o "example.com", fake :-) Pesquisando o assunto, isso parece ser
provocado por que o Apache, via configurações encontradas em um
arquivo chamado "mime.magic", está tentando inferir o tipo MIME pelo
conteúdo. Encontrei este link [1] que indica que o problema é que o
arquivo "mime.magic" não aceita expressões regulares e, portanto,
provoca o erro 500. O workaround indicado é comentar a bendita linha::

0 regex BEGIN[[:space:]]*[{] application/x-awk

Isso tudo, pareceu fazer algum sentido pra mim, embora não tenha
certeza de nada, por isso estou pedindo ajuda.

Acho que eu fiz o que pude para tentar resolver o problema. Uma delas,
foi executar o view no shell (via manage.py) para ter certeza de que o
problema não era no meu código. A resposta (HttpResponse) retorna 200
OK e o conteúdo é o conteúdo no formato JSON que eu esperava
encontrar. Eu também abri um chamado na locaweb para tentar resolver o
problema com eles, mas a última resposta me desanimou *muito*,
deixando a impressão de que isso vai demorar, e eu sou perfeccionista
com *prazos*, afinal de contas :-)

Procurei também sobre a possibilidade de eu incluir as configurações
(ou sobrepor) do mime.magic em meu domínio, tal como no ".htaccess" ou
similar.

[1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=357373

--
Daniel Gonçalves
Base4 Sistemas Ltda.
[www.base4.com.br]
[twitter.com/spanazzi]

Felipe Prenholato

unread,
Aug 3, 2010, 10:33:53 AM8/3/10
to django...@googlegroups.com
ti ta retornando o json como tipo json?
return HttpResponse("{json}",mimetype="application/json") ..?


--
Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>



--
Felipe 'chronos' Prenholato.
Linux User nº 405489
Home page: http://chronosbox.org/blog
Twitter: http://twitter.com/chronossc

Rodrigo Pinheiro Matias

unread,
Aug 3, 2010, 10:40:27 AM8/3/10
to django...@googlegroups.com
Acho que esta tendo uma confusão aqui. o Apache não altera mimetype de forma alguma.
Rodrigo Pinheiro Matias
Bacharel em Ciência da Computação

Celular
+55 (063) 8111.2080

Telefone em horário Comercial
+55 (063) 3216.7564

Blog
http://rodrigomatias.goware.com.br/blog/

Feed
http://rodrigomatias.goware.com.br/blog/feed/

Twitter
http://twitter.com/rodrigopmatias

Daniel Gonçalves

unread,
Aug 3, 2010, 12:49:01 PM8/3/10
to django...@googlegroups.com
@Prenholato: Não tenho certeza do que você quis dizer. Se for o tipo
mime correto na resposta, sim, veja:

def meu_view(request):
lista = Modelo.objects.all()
resposta = serializers.serialize('json', lista)
return HttpResponse(resposta, mimetype="application/json")

@Matias: Não tenho nem muitos recursos para argumentar, pois realmente
não entendo o suficiente do funcionamento do Apache. Mas o link que eu
indiquei discorre sobre um problema -- que me pareceu -- muito
semelhante. A discussão no tópico me pareceu fazer algum sentido,
embora possa estar completamente enganado. Parece que a linha que eu
citei, no arquivo mime.magic, está provocando o erro 500, por que ela
tenta parsear o conteúdo e inferir o tipo mime.

Realmente estou sem recursos, não sei mais o que fazer. O site todo
está funcionando (o admin, e as views que não usam AJAX). O código
onde o problema ocorre é simples como o que eu postei acima. Se alguém
tiver alguma idéia, seja para tentar outra abordagem de depuração ou
qualquer outra coisa... :-)

Em 3 de agosto de 2010 11:40, Rodrigo Pinheiro Matias
<rodrigo...@gmail.com> escreveu:

Felipe Prenholato

unread,
Aug 3, 2010, 1:06:32 PM8/3/10
to django...@googlegroups.com
Humm Daniel, eu não sei como ta sua conf, mas você pode:

1 - desabilitar o mod mime se vc não usar ele
2 - bater um papo com o pessoal da locaweb. o arquivo mime.magic fica lá pelo /usr/share/ até onde me lembro, e eu nunca tive este tipo de problema ... soa para mim como um bug com server desatualizado. Eu checaria as versões que isto ai acontece (a maioria das referencias no google é de 2009) e se é a versão que você ta rodando sua app, qualquer coisa pede pra locaweb solucionar o caso, afinal bug no apache é conta deles :) ... 

Daniel Gonçalves

unread,
Aug 3, 2010, 3:16:16 PM8/3/10
to django...@googlegroups.com
Valeu, Prenholato. Eu já acionei os caras fazerm 3 dias, mas tô
achando que vai demorar um pouco mais. Imaginei que talvez alguém já
tivesse passado por essa :-(
Mas valeu, vou continuar pesquisando. Muito obrigado :-)

Daniel Gonçalves

unread,
Aug 3, 2010, 3:17:25 PM8/3/10
to django...@googlegroups.com
Ops! Prenholato, me fale mais sobre "desabilitar o mod_mime". Pode ser
uma boa saída para testar. Afinal, a resposta em JSON é, na prática,
clear text.

Iuri

unread,
Aug 3, 2010, 3:19:17 PM8/3/10
to django...@googlegroups.com
Esse erro de mod_mime_magic não atrapalha em nada o AJAX. Ele ocorre na locaweb não sei porque.

O erro é outro. O Django te dá erro 500 porque tem algum erro na sua implementação.

[]s
iuri

2010/8/3 Daniel Gonçalves <dan...@base4.com.br>

Daniel Gonçalves

unread,
Aug 3, 2010, 3:31:58 PM8/3/10
to django...@googlegroups.com
Iuri, eu adoraria que o erro realmente fosse no meu código. Por que eu
daí eu corrijo e pronto :-)
Pode ser que você tenha razão. O que eu fiz para testar o meu código e
isolá-lo foi:

1) Executei o shell (via manage.py) usando o console ssh; então eu
executei as linhas da função uma a uma, incluindo os imports
necessários. O HttpResponse criado resultou 200 e o conteúdo era o
conteúdo correto, contendo os dados do meu modelo, belezinha.

2) Invoquei a função na mão -- também no shell, via manage.py, console
ssh: importei o código do view e executei a função (passando um None
no request, já que a função é muito simples e não utiliza o objeto
request para nada). O resultado foi o HttpResponse resultando 200 e o
conteúdo do meu modelo, belezinha também.

Existe alguma outra coisa que eu possa fazer para verificar se o erro
é mesmo no meu código?
Obrigado, Iuri.

Iuri

unread,
Aug 3, 2010, 3:45:37 PM8/3/10
to django...@googlegroups.com
Mostre o seu código simples, pode ser que alguém encontre o erro.

Daniel Gonçalves

unread,
Aug 3, 2010, 3:53:59 PM8/3/10
to django...@googlegroups.com
Já postei numa mensagem anterior, mas aí vai:

def meu_view(request):
lista = Modelo.objects.all()
resposta = serializers.serialize('json', lista)
return HttpResponse(resposta, mimetype="application/json")

Me ocorreu uma outra coisa. Eu estou usando um componente chamado
DjangoFullSerializers [1] para poder fazer com que a serialização
inclua os atributos das chaves naturais (FK e M2M). Na Locaweb eu
criei um diretório "~/.python-local/lib/" e instalei o componente via
easy_install com a opção "-d" (install dir) para o diretório citado.
Daí, coloquei um export para a variável PYTHONPATH no arquivo
".bashrc" e ativei ele::

source .bashrc

Portando, o componente está disponível para mim quando eu executo o
python via console. O que eu estou imaginando é que, se houver uma
outra instância do python em execução que não esteja olhando para a
"minha" variável PYTHONPATH. Daí então, Iuri, você pode ter razão que
o problema é no meu código. Então, o que eu vou fazer para testar é,
modificar o arquivo "index.wsgi" e adicionar o diretório
"~/.python-local/lib/" em sys.path na unha. Mmmm, pode ser. Posto o
resultado aqui assim que eu testar. Caramba! :-)

[1] http://code.google.com/p/wadofstuff/wiki/DjangoFullSerializers

Felipe Prenholato

unread,
Aug 3, 2010, 4:07:37 PM8/3/10
to django...@googlegroups.com
é, você precisa configurar esse python path no apache, via wsgi :), o wsgiscript tem um parametro pra isso... pra vc só ver qual eh seu python path, checa a página que da uma exceção ou usa a tag debug ou envia o sys.path pra qq view.

Frederico Vieira

unread,
Aug 3, 2010, 4:33:09 PM8/3/10
to django...@googlegroups.com
Coloque debug como True e use o firebug para ver o motivo do erro...
Att,

________________________
Frederico Vieira Lima

Daniel Gonçalves

unread,
Aug 3, 2010, 4:44:24 PM8/3/10
to django...@googlegroups.com
É me faltou experiência :-(
Fiz um teste agora e indicou que o problema é no meu código. Vejam:

1) Modifiquei o meu view para http://pastebin.com/Ya5X6CdW
2) No meu arquivo index.wsgi, inseri o caminho para o
"~/.python-local/lib/" na mão e salvei;
3) Invoquei a URL que atinge esse view específico no meu navegador e a
resposta foi:

(<type 'exceptions.ImportError'>, ImportError('No module named
wadofstuff.django.serializers.json',), <traceback object at
0x2ae029d47488>)
~/.python-local/lib
/usr/lib/python26.zip
/usr/lib/python2.6
/usr/lib/python2.6/plat-linux2
/usr/lib/python2.6/lib-tk
/usr/lib/python2.6/lib-old
/usr/lib/python2.6/lib-dynload
/usr/lib/python2.6/site-packages
/usr/lib/python2.6/site-packages/PIL
~/wsgi_apps

Notem que eu substituí o caminho absoluto do diretório home por "~"
apenas para evitar qualquer problema.
Mas o curioso é que (notem a 2a. linha), o meu diretório está no
PYTHONPATH. Ele está enxergando o componente DjangoFullSerializers,
mesmo porque, o settings.py inclui uma referência para ele, através do
dict SERIALIZATION_MODULES. Por que será então, que o componente não
está acessível?

Em 3 de agosto de 2010 17:07, Felipe Prenholato <phili...@gmail.com> escreveu:

Felipe Prenholato

unread,
Aug 3, 2010, 4:52:29 PM8/3/10
to django...@googlegroups.com
1 - Coloque o full path em vez de ~/ (pegue com echo $HOME no seu shell se vc não souber)
2 - se você tem acesso a sua configuração do apache (ou o que quer que rode), de uma olhada nas configurações http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIPythonPath e http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess (procure por python-path) . Eu não me recordo exatamente agora, mas já tive problemas ao setar o path no arquivo .wsgi.

Daniel Gonçalves

unread,
Aug 3, 2010, 4:56:37 PM8/3/10
to django...@googlegroups.com
Valeu Prenholato, mas o "~" eu troquei só para postar aqui, na real
está com o caminho completo. Vou estudar os links que você me passou,
obrigado.
Mas agora, também, estou muito mais tranquilo, já que o erro é no meu
código, conforme o Iuri previu, heheh ;-).
Agora é só colocar o componente no caminho que é provável que funcione.

Frederico Vieira

unread,
Aug 3, 2010, 5:05:51 PM8/3/10
to django...@googlegroups.com
Enquanto não acha o problema, coloque o diretório wadofstuff na raiz do seu projeto que vai funcionar...

É uma medida paleativa até conseguir setar esse componente no pythonpath

Iuri

unread,
Aug 3, 2010, 5:57:33 PM8/3/10
to django...@googlegroups.com
Eu nunca testei instalar uma lib no servidor da locaweb, mas aqui explica direitinho: http://wiki.locaweb.com.br/pt-br/Modulos

Isso deve te mostrar o que vc tá esquecendo.

[]s
iuri

2010/8/3 Frederico Vieira <frederic...@gmail.com>

Daniel Gonçalves

unread,
Aug 3, 2010, 10:04:59 PM8/3/10
to django...@googlegroups.com
Iuri, Prenholato, Matias, Vieira, caras vocês foram muito legais. Funcionou :-)
Iuri, eu tinha usado o link sobre módulos python quando instalei um
servidor Mercurial para podermos compartilhar projetos pessoas em
outras localidades. Eu fiz exatamente daquele jeito que está lá, com
*uma exceção*: ao invés de "easy_install-2.6", usei apenas
"easy_install". Não sei se teve influência ou não, por que a resposta
do Vieira, sobre colocar o módulo na raiz do projeto (que é uma boa
idéia em situações de urgência) me lembrou de um problema que eu tive
tempo atrás que eu tive que colocar o nome do .egg no caminho. Não deu
outra::

1) Eu desinstalei o wadofstuff com "easy_install -m";
2) Instalei de novo com o "easy_install-2.6"
3) Alterei o arquivo "index.wsgi" colocando
"wadofstuff_django_serializers-1.0.0-py2.6.egg" direto no caminho
(caminho completo, claro).

Foi uma sucessão de coisas que me indicaram a direção oposta do erro,
começando com o log do apache. Daí, uma googada me afirmou que o
problema poderia não ser no meu código. Testei com o shell e
funcionou! Pensei, diabos, só pode ser mesmo aquele problema com o
mime. Vejam só. Obrigado a todos, de coração :-)

Iuri

unread,
Aug 3, 2010, 10:07:38 PM8/3/10
to django...@googlegroups.com
Passei por vários problemas parecidos na Locaweb, foi até fácil te mostrar a resposta. :P

Que bom que funcionou.
Reply all
Reply to author
Forward
0 new messages