Django
Erro do django-reversion 1.5 com django <1.3.x
by Felipe 'chronos' Prenholato on 11:06, under Apache, Django, Servidores
Nota: Olá meus caros leitores, apesar do ChronosBox ser um ótimo Blog, eu estou focando meus esforços em um blog conjunto com meu amigo Handrus Nogueira, portanto não deixem de visitar o Dev With Passion! Todos os posts do ChronosBox estarão no Dev With Passion, exceto por alguns comentários novos. Abraços!
Isso me aconteceu a pouco e eu não vi resultados no google para o erro em específico, então estou eu aqui fazendo minha parte
.
Caso você ver o erro abaixo e tiver rodando reversion 1.5 + django 1.2.x, você precisa instalar alguma versão menor que a 1.5 do reversion, pois a 1.5 só suporta django 1.3 (veja tabela de versões aqui).
Segue a exception:
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 | [Tue Sep 27 10:19:17 2011] [error] MyLDAPUser->AUTHENTICATE: felipe.rafael@pdg.com.br authenticated :D [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] mod_wsgi (pid=14847): Exception occurred processing WSGI script '/var/www/qas3/portal/apache/virtualenv-qas3.wsgi'. [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] Traceback (most recent call last): [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/src/django/django/core/handlers/wsgi.py", line 252, in __call__ [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] response = middleware_method(request, response) [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/site-packages/reversion/middleware.py", line 20, in process_response [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] reversion.revision.end() [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/site-packages/reversion/revisions.py", line 301, in end [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] comment = self._state.comment, [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/src/django/django/db/models/manager.py", line 138, in create [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] return self.get_query_set().create(**kwargs) [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/src/django/django/db/models/query.py", line 358, in create [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] obj.save(force_insert=True, using=self.db) [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/src/django/django/db/models/base.py", line 458, in save [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] self.save_base(using=using, force_insert=force_insert, force_update=force_update) [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/src/django/django/db/models/base.py", line 551, in save_base [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] result = manager._insert(values, return_id=update_pk, using=using) [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/src/django/django/db/models/manager.py", line 195, in _insert [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] return insert_query(self.model, values, **kwargs) [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/src/django/django/db/models/query.py", line 1524, in insert_query [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] return query.get_compiler(using=using).execute_sql(return_id) [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/src/django/django/db/models/sql/compiler.py", line 788, in execute_sql [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] cursor = super(SQLInsertCompiler, self).execute_sql(None) [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/src/django/django/db/models/sql/compiler.py", line 732, in execute_sql [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] cursor.execute(sql, params) [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/src/django/django/db/backends/util.py", line 15, in execute [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] return self.cursor.execute(sql, params) [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/src/django/django/db/backends/mysql/base.py", line 86, in execute [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] return self.cursor.execute(query, args) [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/site-packages/MySQLdb/cursors.py", line 176, in execute [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] if not self._defer_warnings: self._warning_check() [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] File "/opt/python2.6/lib/python2.6/site-packages/MySQLdb/cursors.py", line 92, in _warning_check [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] warn(w[-1], self.Warning, 3) [Tue Sep 27 10:19:17 2011] [error] [client 192.168.20.79] Warning: Field 'manager_slug' doesn't have a default value |
JSONResponse – Trabalhando com JSON em Django, o jeito fácil.
by Felipe 'chronos' Prenholato on 00:40, under Apps e extensões, Django, python
Nota: Olá meus caros leitores, apesar do ChronosBox ser um ótimo Blog, eu estou focando meus esforços em um blog conjunto com meu amigo Handrus Nogueira, portanto não deixem de visitar o Dev With Passion! Todos os posts do ChronosBox estarão no Dev With Passion, exceto por alguns comentários novos. Abraços!
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 funcional de JSON em um formulário.
(continue reading…)
Vim confs prontas para trabalhar com Python e Django
by Felipe 'chronos' Prenholato on 06:59, under Dicas, Django, Linux, python, VIM - Vi IMproveded
Nota: Olá meus caros leitores, apesar do ChronosBox ser um ótimo Blog, eu estou focando meus esforços em um blog conjunto com meu amigo Handrus Nogueira, portanto não deixem de visitar o Dev With Passion! Todos os posts do ChronosBox estarão no Dev With Passion, exceto por alguns comentários novos. Abraços!
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 dos paths python e django automáticos ao ambiente do vim.
- Adição da DJANGO_SETTINGS_MODULE automaticamente ao ambiente do vim, para completar seu próprio código.
- Suporte do SnipMate para código django e django templates.
- Django templates com suporte para highlighting das tags e uso do ‘%’ com o plugin matchit.
- Python folding e suporte a python jumping.
- O tema acinzentado wombat com algumas customizações minhas.
- Um gerenciador de sessões para o Vim para facilitar sua vida em manter o ambiente de trabalho.
Aqui estão os arquivos para download:
- vim-confs-latest.tbz2: O arquivo tar compactado com todos os arquivos, descompacte na sua home.
- vim-confs-latest.tbz2.md5: O md5sum do tar.
Se você preferir, este é o endereço no github: http://github.com/chronossc/my-vim-confs
O pacote não poderia ter sido criado sem alguns plugins e artigos, segue a referência:
- UsingVimWithDjango do Django Wiki
- SnipMate vim plugin por Michael Sanders
- SnipMate snippets for django por Rob Hudson (Demo)
- Matchit vim plugin por Benji Fisher
- Updated Syntax highlighting for Django templates por Dave Hodder
- py_jump vim plugin por Sergiy Matusevych
- python fold vim plugin por Jorrit Wiersma
- Session Manager for vim por Yuri Klubakov
Adicionalmente (thx Handrus), eu sugiro para quem escreve muito HTML, dar uma olhada no SparkUp vim and textmate plugin
. Eu não testei, mas pareceu muito bom.
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!
Agora bora codar com o vim
** Atualizado
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
.
2010-03-09: Eu criei novamente o tar, fiz alguns fixes e adicionei no github.
Configurando múltiplos ambientes Python
by Felipe 'chronos' Prenholato on 00:20, under Dicas, Django, Gentoo, python
Nota: Olá meus caros leitores, apesar do ChronosBox ser um ótimo Blog, eu estou focando meus esforços em um blog conjunto com meu amigo Handrus Nogueira, portanto não deixem de visitar o Dev With Passion! Todos os posts do ChronosBox estarão no Dev With Passion, exceto por alguns comentários novos. Abraços!
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 ‘setar’ 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 ‘ambiente’, trata-se de uma função que você cria no seu .bash_profile. 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:
export ORIGINALPATH=$PATH loadpyenv(){ # $PV is our control variable, get from $1, first argument on shell # anything that you need to put here and depend for python version ${PV} is your var ;) export PV=$1 echo -e "\n:: Setting environ to use python $PV" # Put here various aliases that you can use # put a python alias alias python="python${PV}" # m and runserver a kick alias for Django common actions alias m="python${PV} manage.py" alias runserver="python${PV} manage.py runserver :8000" # easy and fast install of python packages, in right path with localpyinstall alias localpyinstall="python${PV} setup.py install --prefix=~/.py/${PV}/" echo -e "\n:: New aliases" # print aliases :) alias python m runserver localpyinstall echo -e "\n:: New PATH" # setup aplications path, be careful about not use $ORIGINALPATH. # # I use a path structure like that: # ~/.py/ # |-- 2.4 # |-- 2.5 # `-- 2.6 export PATH="${HOME}/.py/${PV}/bin/:${ORIGINALPATH}" echo $PATH echo -e "\n:: New PYTHON PATH" # setup new python path, don't need to add system wide path, just our custom paths export PYTHONPATH="${HOME}/.py/${PV}/lib/python${PV}/site-packages/" # print more some info python$PV -c "import sys;print sys.path" echo -e "\n:: Django version & file" python$PV -c "import django;print 'version %s ... file %s' % (django.get_version(),django.__file__);" }
Agora crie uma estrutura de diretórios com o comando:
$ mkdir -pv ~/.py/{2.4,2.5,2.6}
E cada vez que for usar uma versão diferente do python, carregue com:
$ loadpyenv VERSÃO
Onde VERSÃO é a versão escolhida do python.
Várias versões do Python no Gentoo
O Gentoo Linux, 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:
USE_PYTHON="2.4 2.5 2.6"
Instale os pythons nas versões escolhidas e execute o seguinte comando para re-compilar seus pacotes:
emerge $(eix -I dev-python/* | grep "\[I\]" | cut -d' ' -f2)
O eix é uma aplicação de indexação do portage, muito comum nas máquinas Gentoo.
Cada pacote python é recompilado para as 3 versões (no caso), mas tive problemas em compilar alguns pacotes para a 2.4, fiquem avisados
Bom, é isso, até mais!
Manipulando erros Http 403 (permissão negada) no Django
by Felipe 'chronos' Prenholato on 17:35, under Apps e extensões, Django
Nota: Olá meus caros leitores, apesar do ChronosBox ser um ótimo Blog, eu estou focando meus esforços em um blog conjunto com meu amigo Handrus Nogueira, portanto não deixem de visitar o Dev With Passion! Todos os posts do ChronosBox estarão no Dev With Passion, exceto por alguns comentários novos. Abraços!
Olá pessoal
. Recentemente, precisei usar o módulo Auth do Django e suas permissões. É bastante interessante como você pode definir permissões por módulo e usar nas views, templates, etc.
Nosso código de hoje vem da necessidade de trabalhar facilmente com permissões negadas, onde o Django fornece apenas um HttpResponseForbidden, o que não é exatamente interessante de manipular, pois o ideal seria algo como a manipulação de erros 404.
Com essa necessidade desenvolvi um Middleware que intercepta exceções Http403 (vem junto com o pacote), e retorna uma das seguintes opções, na ordem de prioridade:
- Uma view customizada, configurada usando handler403 no seu urls.py
- Renderiza o template 403.html
- Renderiza um template Hardcoded
Para usar o Middleware, siga os procedimentos:
- Baixe o projeto no fim deste post, vamos usa-lo de exemplo, ele se chama http403project.
- Descompacte e copie o arquivo http.py para algum lugar do seu projeto, no http403project ele fica na raiz.
- Adicione o middleware ao settings.py:
MIDDLEWARE_CLASSES = ( # ... 'http403project.http.Http403Middleware', )
- De raise na view, ex:
from http import Http403 def Http403View(request): raise Http403(u"This is custom message for permission denied.")
- Configure sua view customizada ou template se desejar. Seu template deve ter o nome de 403.html, sua view recebe os argumentos request e exception, o argumento exception contem a mensagem enviada pelo usuário
. No projeto exemplo ele está renderizando o template 403.html, mas existe uma view de exemplo bastante simples no arquivo urls.py
Projeto: http403project.tgz
Ok, é isto, super simples, por hoje é só
, divirtam-se!
Pensamento rápido – “ilike” SQL
by Handrus Nogueira on 12:18, under Dicas, Django, Multi Database, MySQL
Nota: Olá meus caros leitores, apesar do ChronosBox ser um ótimo Blog, eu estou focando meus esforços em um blog conjunto com meu amigo Handrus Nogueira, portanto não deixem de visitar o Dev With Passion! Todos os posts do ChronosBox estarão no Dev With Passion, exceto por alguns comentários novos. Abraços!
Hoje vi um post num dos blogs que acompanho, onde um camarada disse ter conseguido 1000% de melhora na performance de uma aplicação trocando um:
SELECT * FROM TABLE WHERE fieldname ILIKE 'abc%';
Para
SELECT * FROM TABLE WHERE LOWER(fieldname) LIKE 'abc%';
(diferença de ilike para lower… like)
Eu achei tosco (hehehe), óbviamente que esse ganho absurdo só pode ter ocorrido numa massa gigantesca de dados e provavelmente num campo sem índice.
Mas a minha dica é outra:
Além do ganho em performance o “ilike” não é suportado no mysql e sqlite.Portanto seu uso é extremamente desaconselhável, principalmente se você estiver trabalhando com Django, Rails ou qualquer aplicação que forneça um layer multi-db.
Claro que nos frameworks citados acima o único jeito de fazer isso é forçar o uso de “ilike”, suas ORMs conseguem lidar com situações assim muito bem.
Conclusão
Evite “ilike” em queries de sql, use o “lower()… like” ou “upper… like”; E se lembre de mudar sua variável para upper/lower!
Escritório Portátil do Desenvolvedor Web
by Handrus Nogueira on 22:26, under Dicas, Django, Editores
Seguindo as “febres” de artigos que só listam coisas úteis aqui vai minha lista de softwares portables e com licença free (alguns freeware, outros open-source) para você levar na pen-drive ou disco externo e ser capaz de lidar com qualquer situação desde que tenha um windows à mão. O foco são desenvolvedores PHP e PyWeb.
1 – Browsers
Firefox 3.5, chrome, opera, avant browser. – Não faz sentido IE se você já está num windows certo? E ainda que você precise de outras versões lembre-se que estou falando de licenças free. A microsoft ainda não liberou nenhuma versão portable.
2 – Editores/IDEs
Aptana – apenas escolha zip file na opção ” download type”, Zend, Notepad++,
Gvim
Separei o Gvim por causa de alguns plugins.
Rails, PHP, CSS, CSS Color Preview, javascript, SQL, MySQL Runner e para os que gostam do estilo IDE, tentem o Proj
No caso do Gvim, considere ver o post do wombat modificado.
Também vem vindo aí um post meu sobre vim/gvim… fiquem de olho!
3 – Editores de Imagem
Gimp, Incscape, PickPick (screenshot e color picker).
4 – Escritório / Comunicação
Open-Office, Pidgin, aMsn, Thunderbird e lightning para thunderbird para os calendários e to-do.FoxitReader para abrir pdfs
5 – FTP / SSH
6 – Utilitários
7-zip, FreeFileSync,Font Matcher, WinMerge, InfraRecorder, Wink
7 – Servidores Web
PHP: Xampp,USB Web Server
– UPDATE: pra mim nenhum dos dois servidores para Django funcionaram, se você teve sucesso, poste uma mensagem contando como
Django: IntantDjango, DjangoStack
Django apps (coleção) – parte 1
by Felipe 'chronos' Prenholato on 03:14, under Apps e extensões, Django
Eu estou trabalhando atualmente com Python e Django, a linguagem e o framework
são excelentes e como pretendo desenvolver um projeto bastante interessante
com ele estou listando aqui alguns dos apps que achei bastante interessante
em uma rápida pesquisa no Django Plugables e outros lugares.
Estou dividindo o artigo em duas partes e postarei uma por semana, coloquem
suas sugestões nos comentaŕios
.