Problema com string Unicode: às vezes o objeto não é encontrado

196 views
Skip to first unread message

João Olavo Baião de Vasconcelos

unread,
Oct 18, 2010, 3:12:14 PM10/18/10
to django...@googlegroups.com
Pessoal,

Está acontecendo um erro muito estranho e preciso de ajuda para entender o que pode ser.

Eu fiz uma action no Admin que faz redirect para uma URL passando uns parâmetros como GET. Ao cair nessa URL, eh chamada uma view.

A URL é do tipo: http://server/relatorio/depentencias/?nome=SERVICO

Passa como parâmetro o nome de um (ou mais, separados por vírgula) serviços cadastrados e ele retorna uma página HTML com as dependências desse serviço.

A view lê o nome dos serviços e busca por eles via Servico.objects.get(nome=nome_servico).

O problema que acontece é que, quando o nome do serviço tem um caracter especial (cedilha ou acento), acontece uma exceção DoesNotExist, informando que a query não encontrou o objeto procurado.

O estranho é que se eu ficar recarregando a mesma página (dando F5), o objeto eh encontrado e a página esperada é carregada! Às vezes acontece no segundo F5, às vezes preciso de apertar umas 6 vezes.

Já mandei imprimir o tipo da string "nome_servico" e é do tipo unicode. Se eu imprimir a string em si, dá erro de UnicodeEncodeError na linha do print.

Alguém tem alguma ideia do que pode estar acontecendo??

--
João Olavo Baião de Vasconcelos
Analista de Sistemas - Infraestrutura
joaoolavo.wordpress.com

Gileno Alves

unread,
Oct 18, 2010, 3:19:59 PM10/18/10
to django...@googlegroups.com
Você passa a string com acento para a requisição GET?
Se for o caso, caracteres especiais devem passar por uma conversão para ficarem na url, procure por urlencode.

2010/10/18 João Olavo Baião de Vasconcelos <joao...@gmail.com>

--
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/>



--
Abraços
Gileno Filho

Felipe Prenholato

unread,
Oct 18, 2010, 3:21:45 PM10/18/10
to django...@googlegroups.com
Essa repetição de F5 ta rolando no servidor de dev ou no apache?

O apache pode fazer cache bem chato nesse tipo de coisa.

--
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
Use http://1l.to to shrink your urls :)

João Olavo Baião de Vasconcelos

unread,
Oct 18, 2010, 8:46:01 PM10/18/10
to django...@googlegroups.com
2010/10/18 Felipe Prenholato <phili...@gmail.com>
Essa repetição de F5 ta rolando no servidor de dev ou no apache?

Apache. Amanhã irei testar no de dev.
 
O apache pode fazer cache bem chato nesse tipo de coisa.

Mas eh um cache mt estranho... Primeiro ele não encontra, depois encontra, no F5 seguinte ele já não encontra novamente.
 
Farei mais testes para identificar melhor.

Estou usando Oracle 10 + Apache + WSGI + CentOS 5 + Django 1.2.3.

João Olavo Baião de Vasconcelos

unread,
Oct 18, 2010, 8:47:51 PM10/18/10
to django...@googlegroups.com
2010/10/18 Gileno Alves <gasc...@gmail.com>
Você passa a string com acento para a requisição GET?

Sim, via GET. Mas eu não escrevo na mão, eu pego a variável 'nome' do modelo através da action.
 
Se for o caso, caracteres especiais devem passar por uma conversão para ficarem na url, procure por urlencode.

Então a action recebe a string e eu faço o redirect já usando esse urlencode? Irei tentar.

Obrigado!
 

João Olavo Baião de Vasconcelos

unread,
Oct 19, 2010, 5:43:37 AM10/19/10
to django...@googlegroups.com
2010/10/18 João Olavo Baião de Vasconcelos <joao...@gmail.com>
2010/10/18 Felipe Prenholato <phili...@gmail.com>
Essa repetição de F5 ta rolando no servidor de dev ou no apache?
Apache. Amanhã irei testar no de dev.

Felipe, realmente, o problema só acontece no Apache.

Alguma ideia do que pode estar acontecendo ou de como resolver isso?

Obrigado!

Henr"Ikke" Pereira

unread,
Oct 19, 2010, 6:26:57 AM10/19/10
to django...@googlegroups.com
Reinicia/Recarrega o apache após cada alteração nos teus arquivos.
Provavelmente algum worker/thread do apache tá com o teu projeto
(cacheado/)carregado em memória.


--
Henr"Ikke" G.G. Pereira
http://www.halts.com.br
+55 (55) 9619-7499
|_|0|_|
|_|_|0|
|0|0|0|

2010/10/19 João Olavo Baião de Vasconcelos <joao...@gmail.com>:

João Olavo Baião de Vasconcelos

unread,
Oct 19, 2010, 6:53:22 AM10/19/10
to django...@googlegroups.com
2010/10/19 Henr"Ikke" Pereira <ikk...@gmail.com>
Reinicia/Recarrega o apache após cada alteração nos teus arquivos. Provavelmente algum worker/thread do apache tá com o  teu projeto (cacheado/)carregado em memória.

Eu sempre faço o reload do apache, e isso já efetiva as modificações realizadas.

Vou fazer o restart para verificar.

João Olavo Baião de Vasconcelos

unread,
Oct 21, 2010, 11:18:45 AM10/21/10
to django...@googlegroups.com
2010/10/19 João Olavo Baião de Vasconcelos <joao...@gmail.com>

2010/10/19 Henr"Ikke" Pereira <ikk...@gmail.com>
Reinicia/Recarrega o apache após cada alteração nos teus arquivos. Provavelmente algum worker/thread do apache tá com o  teu projeto (cacheado/)carregado em memória.
Eu sempre faço o reload do apache, e isso já efetiva as modificações realizadas.
Vou fazer o restart para verificar.

Parei e iniciei o serviço do Apache, mas o problema continuou.

Gileno, vc poderia ser mais específico em como eu usaria o urlencode? Eu não estou usando template nenhum, estou gerando um HTML puro.

Eu tentei usar o smart_unicode(), mas também não adiantou. A minha view está lendo a URL da seguinte maneira:

from django.utils.encoding import smart_unicode
nomes = smart_unicode(request.GET["nomes"]).split(',')

Está correto?

Estou chamando uma URL passando "ã", mas poderia ser qq outro caracter especial.

Gileno Alves

unread,
Oct 21, 2010, 12:20:41 PM10/21/10
to django...@googlegroups.com
Onde você cria a url? Eu acho que o problema não é na leitura e sim na criação.
Me diga onde você cria que eu vejo o que eu posso ajudar.

2010/10/21 João Olavo Baião de Vasconcelos <joao...@gmail.com>
--
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/>



--
Abraços
Gileno Filho

João Olavo Baião de Vasconcelos

unread,
Oct 21, 2010, 1:07:51 PM10/21/10
to django...@googlegroups.com
2010/10/21 Gileno Alves <gasc...@gmail.com>
Onde você cria a url? Eu acho que o problema não é na leitura e sim na criação.
Me diga onde você cria que eu vejo o que eu posso ajudar.

No caso, eu estou digitando a URL na mão mesmo, na barra de endereço do Firefox. Isso para depois criar uma search engine do firefox (campo de busca no canto superior direito).
http://servidor/relatorio/dependencias/?nomes=SERVIÇO1,SERVIÇO2

Acredito que essa escrita está sendo feita em UTF-8, já que o problema só acontece quando utilizo o Apache (no servidor de desenvolvimento do Django não ocorre esse problema).

Não teria nada a ver com o módulo WSGI do Apache não?

Gileno Alves

unread,
Oct 21, 2010, 1:20:11 PM10/21/10
to django...@googlegroups.com
Tenta substituir o "Ç" nesse exemplo que você está usando por  %C7

2010/10/21 João Olavo Baião de Vasconcelos <joao...@gmail.com>
--
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/>



--
Abraços
Gileno Filho

João Olavo Baião de Vasconcelos

unread,
Oct 21, 2010, 2:49:48 PM10/21/10
to django...@googlegroups.com
2010/10/21 Gileno Alves <gasc...@gmail.com>
Tenta substituir o "Ç" nesse exemplo que você está usando por  %C7

No lado do servidor, eu leio a string com esse "%C7". Eu teria que transformar isso de volta para Ç para procurar pelo nome correto do objeto.

Acontece que isso não é viável, pois o usuário irá digitar o nome da forma correta (ç, á, etc). =/

Valeu!

Gileno Alves

unread,
Oct 21, 2010, 3:07:32 PM10/21/10
to django...@googlegroups.com
Mas o usuário vai escrever direto na url do browser? Quando o browser submete algum formulário com caracteres especiais ele faz essa conversão e quando o django recebe essa conversão converte novamente para o caractere especial.

João Olavo Baião de Vasconcelos

unread,
Oct 21, 2010, 7:27:48 PM10/21/10
to django...@googlegroups.com
2010/10/21 Gileno Alves <gasc...@gmail.com>
Mas o usuário vai escrever direto na url do browser? Quando o browser submete algum formulário com caracteres especiais ele faz essa conversão e quando o django recebe essa conversão converte novamente para o caractere especial.

Ele irá escrever no campo de busca do Firefox (search engine).

O Firefox então irá montar uma URL com parâmetros GET, sendo um dos parâmetros a palavra escrita no campo de busca.
 
Reply all
Reply to author
Forward
0 new messages