October archive
Cron dentro do Django com Celery
October 19, 2010
Ontem na parte da noite conversando com um conhecido ele falou que estava usando em um projeto o Celery, como ainda não conhecia vamos estudar este projeto. Gostei da forma que ele trabalha e como ele integra com o Django.
Tenho em um projeto uma fila de processamento só que foi desenvolvido por mim e não tem todos os recursos que o Celery tem.
Vou explicar como usar o Celery com o Django em um exemplo simples, e como sempre basta usar a criatividade para desenvolver a sua necessidade.
Primeiramente temos que instalar dois pacotes Python para que possamos trabalhar com o Celery no Django, o django-celery e ghettoq. Caso tenhamos o easy_install instalado basta instalar os pacotes da seguinte forma:
$ easy_install django-celery
$ easy_install ghettoq
Caso não tenha vamos instalar:
$ cd /usr/src/
$ git clone http://github.com/ask/django-celery.git
$ cd django-celery
$ python setup.py build
$ python setup.py install
$ cd ..
$ git clone http://github.com/ask/ghettoq
$ cd ghettoq
$ python setup.py build
$ python setup.py install
Após instalar vamos criar um projeto para que possamos trabalhar com o Celery nele.
$ django-admin.py startproject celerytest
$ cd celerytest
Vamos editar o settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'test',
}
}
...
CARROT_BACKEND = "ghettoq.taproot.Database"
INSTALLED_APPS = (
...
'djcelery',
'ghettoq',
)
Após declarar qual biblioteca o projeto em Django vai carregar podemos sincronizar o nosso database:
$ python manage.py syncdb
Temos que criar um arquivo chamado tasks.py, esse arquivo trabalha como o models de uma aplicação:
from celery.task.schedules import crontab
from celery.decorators import periodic_task
# this will run every minute, see http://celeryproject.org/docs/reference/celery.task.schedules.html#celery.task.schedules.crontab
@periodic_task(run_every=crontab(hour="*", minute="*", day_of_week="*"))
def test():
print "Tarefa de teste..."
Agora temos que dar start em nosso daemon Celery:
$ python manage.py celeryd -v 2 -B -s celery -E -l INFO
2010-10-19 05:34:44,215: WARNING/MainProcess] celery@program-8 v2.1.1 is starting.
[2010-10-19 05:34:44,216: WARNING/MainProcess] /usr/local/lib/python2.6/dist-packages/celery-2.1.1-py2.6.egg/celery/apps/
worker.py:105: UserWarning: Running celeryd with superuser privileges is not encouraged!
"Running celeryd with superuser privileges is not encouraged!")
[2010-10-19 05:34:44,216: WARNING/MainProcess] /usr/local/lib/python2.6/dist-packages/celery-2.1.1-py2.6.egg/celery/apps/
worker.py:108: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in a production environment!
warnings.warn("Using settings.DEBUG leads to a memory leak, "
[2010-10-19 05:34:44,222: WARNING/MainProcess]
Configuration ->
. broker -> ghettoq.taproot.Database://guest@localhost/
. queues ->
. celery -> exchange:celery (direct) binding:celery
. concurrency -> 2
. loader -> djcelery.loaders.DjangoLoader
. logfile -> [stderr]@INFO
. events -> ON
. beat -> ON
. tasks ->
. celerytest.lol.tasks.test
[2010-10-19 05:34:44,238: INFO/PoolWorker-2] child process calling self.run()
[2010-10-19 05:34:44,239: INFO/PoolWorker-3] child process calling self.run()
[2010-10-19 05:34:44,241: WARNING/MainProcess] celery@program-8 has started.
[2010-10-19 05:34:44,241: INFO/Beat] child process calling self.run()
[2010-10-19 05:34:44,241: INFO/Beat] Celerybeat: Starting...
[2010-10-19 05:35:00,537: INFO/MainProcess] Got task from broker: celerytest.lol.tasks.test[22d15af7-8fe9-4acd-bdde-06265004eb50]
[2010-10-19 05:35:00,760: WARNING/PoolWorker-3] firing test task
[2010-10-19 05:35:01,088: INFO/MainProcess] Task celerytest.lol.tasks.test[22d15af7-8fe9-4acd-bdde-06265004eb50] processed: None
Pronto ele esta rodando.
O Celery é um projeto muito bom só que ainda estamos enfrentando alguns bugs com processos pesado o pior que ele para de processar e não esta dando nem um retorno, por isso antes colocar em produção teste sua aplicação onde o Celery vai rodar.
Par ou Ímpar com Python
October 18, 2010
Como vocês viu gosto muito de matemática, então nada melhor de juntar Matemática com Python, um script simples em Python para identificar se o numero digitado é Par ou Ímpar.#!/usr/bin/env python
n = raw_input("Numero: ")
if n%2==0:
print "Par"
else:
print "Impar"
Não tem muito segredo mas no teste do evento Google Developer Day caiu coisa do tipo.
Identificando dispositivo movel no Django
October 16, 2010
Hoje temos uma biblioteca chamada de Bloom Device feira para Django desenvolvida por bishanty e kevin.tom.Como instalar?
$ wget http://django-bloom.googlecode.com/files/bloom-0.1.tar.gz $ tar -tzvf bloom-0.1.tar.gz $ cd django-bloom $ python setup.py install
Antes de instalar esta biblioteca teríamos que fazer da segunte forma:
>>> request.META['HTTP_USER_AGENT'] 'SonyEricssonW850i/R1GB Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1'
E pegar o resultado do HTTP_USER_AGENT e parcia. Com o Bloom Device ele retorna um JSON:
>>> request.device
{u'mobileDevice': '1', u'displayWidth': '240', u'displayHeight': '320', u'vendor': 'Sony Ericsson', u'model': 'W850i', ...}
Como usar no Django?
Depois de instalado temos que instanciar o Bloom Device no Django no settings.py:
INSTALLED_APPS = ( ... 'bloom.device', ... ) ... MIDDLEWARE_CLASSES = ( ... 'bloom.device.middleware.DeviceDetectMiddleware', ... )
Na views da aplicação vamos usar assim:
@detect_device from bloom.device.decorators import detect_device def my_view(request): print request.device ...
Agora vai a criatividade para poder trabalhar com o Bloom Device.
Recomendações
Calculo de Bhaskara via Python
October 15, 2010
O foco este post é levar você aprender computação com Python. Para calcular as raízes em função do segundo grau, utilizamos uma fórmula muito querida por todos que estudam no ensino médio, a famosa fórmula de Bhaskara:
Neste exemplo temos os coeficientes, a=2, b= -6 e c= -20 (Muita atenção para os sinais)
Agora substituindo na fórmula de Bhaskara:
Agora chegamos no momento crucial do cáculo das raízes.
Devemos separar esta conta em duas: uma com o sinal de + e a outra com o sinal de -. Assim:
Portanto as duas raízes da função são 5 e -2.
Chega de blablabla e vamos ver como isso fica em Python:
import math
import sys
a=input ("a:")
b=input ("b:")
c=input ("c:")
d=(b^2)-(4*a*c) #Mário Meyer
# d=((b^2)-4*a)*c Esta errado esta linha, usar a linha superior.
if d<0 :
print ("Delta negativo, raiz impossivel de ser extraida.")
sys.exit()
else : print "Delta: %s." % d
m1=math.sqrt(d)
x1=(-b+m1)/(2*a)
x2=(-b-m1)/(2*a)
print "Raiz ~ X1= %s." % x1
print "Raiz ~ X2= %s." % x2
Oportunidade Python - UPX
October 14, 2010
Empresa de Alphaville (São Paulo) procura DOIS programadores Python para trabalharem presencialmente desenvolvendo em framework Django. Contratação imediata. Características obrigatórias:- Fluência em Python e Django.
- Fluência em inglês escrito.
- Disponibilidade para trabalhar das 9h às 18h em Alphaville.
- Ser usuário GNU Linux.
- Noções de Mercurial.
- Experiência com Webservices.
- Noções de Google AppEngine.
Gerando SVG com Python
October 11, 2010
Em baixo veja um código de como gerar SVG com Pythonimport os
display_prog = 'display'
class Scene:
def __init__(self,name="svg",height=400,width=400):
self.name = name
self.items = []
self.height = height
self.width = width
return
def add(self,item): self.items.append(item)
def strarray(self):
var = ["\n",
"\n"]
return var
def write_svg(self,filename=None):
if filename:
self.svgname = filename
else:
self.svgname = self.name + ".svg"
file = open(self.svgname,'w')
file.writelines(self.strarray())
file.close()
return
def display(self,prog=display_prog):
os.system("%s %s" % (prog,self.svgname))
return
class Line:
def __init__(self,start,end):
self.start = start #xy tuple
self.end = end #xy tuple
return
def strarray(self):
return [" \n" %\
(self.start[0],self.start[1],self.end[0],self.end[1])]
class Circle:
def __init__(self,center,radius,color):
self.center = center #xy tuple
self.radius = radius #xy tuple
self.color = color #rgb tuple in range(0,256)
return
def strarray(self):
return [" \n" % colorstr(self.color)]
class Rectangle:
def __init__(self,origin,height,width,color):
self.origin = origin
self.height = height
self.width = width
self.color = color
return
def strarray(self):
return [" \n" %\
(self.width,colorstr(self.color))]
class Text:
def __init__(self,origin,text,size=24):
self.origin = origin
self.text = text
self.size = size
return
def strarray(self):
return [" \n" %\
(self.origin[0],self.origin[1],self.size),
" %s\n" % self.text,
" \n"]
def colorstr(rgb): return "#%x%x%x" % (rgb[0]/16,rgb[1]/16,rgb[2]/16)
def main():
scene = Scene('test')
scene.add(Rectangle((100,100),200,200,(0,255,255)))
scene.add(Line((200,200),(200,300)))
scene.add(Line((200,200),(300,200)))
scene.add(Line((200,200),(100,200)))
scene.add(Line((200,200),(200,100)))
scene.add(Circle((200,200),30,(0,0,255)))
scene.add(Circle((200,300),30,(0,255,0)))
scene.add(Circle((300,200),30,(255,0,0)))
scene.add(Circle((100,200),30,(255,255,0)))
scene.add(Circle((200,100),30,(255,0,255)))
scene.add(Text((50,50),"Thiago Avelino gerando SVG com Python"))
scene.write_svg()
scene.display()
return
if __name__ == '__main__':
main()
Repositório para linguagem Python - PyPI
October 10, 2010
PyPI (Python Package Index) é um repositório para linguagem Python. Hoje temos 11.559 software no repositório. Caso você use PyPI e ache um erro basta reporta o BUG para o Support Requests. Você tem uma aplicação e acha que a mesma pode ajudar outras pessoas você pode colocar a sua aplicação no PyPI, basta ler como reporta a aplicação aqui. Veja todas as aplicações