Author Archive
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 |
Introdução ao PostgreSQL e HTML 5 (WTH!?)
by Felipe 'chronos' Prenholato on 23:07, under Databases, HTML5, PostgreSQL
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!
O MySQL é um banco muito conhecido, e muitos sabem ‘usar’. O PostgreSQL já não é tão conhecido e muitos só já ouviram falar. Com este fato, a pouco tempo, comecei a desenvolver uma série de slides introdutórios ao PostgreSQL, tendo como alvo uma palestra na Lightcomm, empresa onde trabalho.
Os slides em si, são bastante introdutórios, apenas ao nível básico, então se quem conhece bem PostgreSQL quiser dar uma revisada eu ficaria muito honrado
. A parte interessante destes slides para quem já conhece PostgreSQL e até mesmo para quem nunca mecheu, é que elas usam como ‘engine’ os slides demonstrados no html5rocks.com, todo baseado em HTML5 / CSS3 / JS … Atualmente só testei ele no Chrome, e o resultado, na minha opnião foi muito bom.
Desenvolvi a palestra com muito conforto, pois é puro HTML / CSS, os slides ainda do html5rocks.com ainda vem com demos de uso de SVG, vídeo e áudio, o que pode realmente ser muito útil em palestra mais complexas (introdução ao Django por exemplo). Eu adotei esse método como o meu default para construção de slides, o código está no github [1] e se quiser você pode fazer o download do pacote tgz / zip [2]
Eu aconselho a experimentar! Quem quiser pode contribuir melhorando a palestra, traduzindo para outras línguas ou só me apontando bugs
[1]http://github.com/chronossc/postgres_presentation/
[2] http://github.com/chronossc/postgres_presentation/downloads
See ya
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.
Migrando bases de dados LATIN1 para UTF-8 com o PostgreSQL
by Felipe 'chronos' Prenholato on 03:59, under Databases, Debian/Ubuntu, Dicas, Gentoo, Linux, PostgreSQL, Servidores
Nos dias atuais é um padrão que todos os sites e servidores web rodem ao menos com UTF-8 como encoding default, entretanto pode-se encontrar casos onde ainda se roda LATIN1 ou até mesmo ASCII.
O caso que tratamos hoje é de um servidor Debian, versão 5.0.3 (lenny), que usava o encode LATIN1 quando instalado e configurado o Postgresql, e não me deixava criar uma base de dados UTF-8, gerando o seguinte erro:
debian:~# su postgres -c 'createdb teste3 -E UTF-8' createdb: database creation failed: ERROR: encoding UTF8 does not match server's locale en_US DETAIL: The server's LC_CTYPE setting requires encoding LATIN1.
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!
Atualize o hosts.deny para bloquear tentativas de brute force
by Felipe 'chronos' Prenholato on 14:14, under Linux, Servidores
Ai embaixo um simples script para você bloquear hosts tentando brute force no seu SSH, muitas das vezes pode sanar o problema de ter uma porta diferente pro ssh
O script varre o /var/log/messages para detectar tentativas de invasão, pega os hosts, e adiciona no /etc/hosts.deny
Código:
#!/bin/bash</code> cp /etc/hosts.deny /var/tmp/hosts.deny # Jun 8 00:39:43 mintaka sshd[23332]: User root from 222.77.183.51 not allowed because not listed in AllowUsers egrep "$(date +%b) ($(date +%d)|$(date +%e)).*User .* from [a-z0-9\.]* not allowed because not listed in AllowUsers" /var/log/messages | sed -e 's/.* from \([a-z0-9\.]*\) .*/\1/' | sort | uniq | sed -e 's/^/ALL:/' > /etc/hosts.deny ; #Jun 8 11:54:33 mintaka sshd[31221]: Invalid user bob from 62.204.145.224 egrep "$(date +%b) ($(date +%d)|$(date +%e)).*Invalid user .* from [a-z0-9\.]*$" /var/log/messages | sed -e 's/.*Invalid user .* from//' | sort | uniq | sed -e 's/^/ALL:/' >> /etc/hosts.deny ; diff -u /etc/hosts.deny /var/tmp/hosts.deny &>/dev/null || (echo "** hosts.deny updated **" ; cat /etc/hosts.deny)
Script funcionando:
Sep 2 16:55:02 mintaka -- MARK --
Sep 2 13:58:10 mintaka sshd[20790]: Did not receive identification string from 189.2.118.72
Sep 2 13:58:34 mintaka sshd[20795]: Invalid user suporte from 189.2.118.72
# Tentativa de brute force
Sep 2 13:58:41 mintaka sshd[20798]: Invalid user suporte from 189.2.118.72
Sep 2 13:58:43 mintaka sshd[20800]: Invalid user suporte from 189.2.118.72
Sep 2 13:58:46 mintaka sshd[20802]: Invalid user suporte from 189.2.118.72
Sep 2 13:58:49 mintaka sshd[20804]: Invalid user suporte from 189.2.118.72
Sep 2 13:58:51 mintaka sshd[20806]: Invalid user suporte from 189.2.118.72
Sep 2 13:59:24 mintaka sshd[20817]: Did not receive identification string from 189.2.118.72
# Script roda
** hosts.deny updated **
ALL:74.221.239.100
ALL: 189.2.118.72
ALL: 200.27.79.101
ALL: 74.221.239.100
# E os hosts agora estão bloqueados
Sep 2 14:00:09 mintaka sshd[20826]: Invalid user teste2008 from 189.2.118.72
Sep 2 14:00:10 mintaka sshd[20864]: refused connect from 189.2.118.72 (189.2.118.72)
Eu rodo em minha máquina a cada 2 minutos
Fast quote on #django
by Felipe 'chronos' Prenholato on 00:57, under Quotes
Fast quote on #django
<the-teacher> the-man: welcome to Python
<the-man> the-teacher: welcome to what?
<the-man> the-teacher: what is a python?
<some-people> lol
<the-teacher> the-man: the language Django is written in, you twit
<chronos> husahduas… I’m reading it..
<the-man> the-teacher: language?
<some-people-2> the-man, …
<the-man> the-teacher: like, english?
<chronos> need a quote…
<some-people> ”
<the-man> oh come on, don’t bullshit me with “welcome to Python”
<the-man> @ the-teacher
…
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
.