Thiago Avelino Desenvolvedor Python, Django e MongoDB



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:
Onde cada letra desta fórmula representa os coeficientes da função do segundo grau que queremos resolver. Basta substituir e achar os valores. Podem notar que há um ± no meio da fórmula. Pois é, é daí que irá sair dois resultados: um com o sinal de + e outro com o sinal de -. Veja o exemplo: 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: Características desejáveis: A faixa salarial é de ~ R$ 5.000,00. Os currículos (ou portfólios) devem ser enviados em para thiago.ayub AT upx DOT com DOT br

Gerando SVG com Python

October 11, 2010

Em baixo veja um código de como gerar SVG com Python
import 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" % (self.height,self.width),
               " \n"]
        for item in self.items: var += item.strarray()            
        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