Criando um Pacote Django

Passo a Passo para criar o seu pacote Django

VI encontro PythonOnRio
Élysson Mendes Rezende
Desenvolvedor pleno na BrBid.com

O que é um um Pacote Django?

  • Código Reusável para resolver problemas comuns
  • Essencialmente um pacote Django é um Pacote Python
  • Pode ser um pacotezinho ou um App Django Completo
  • Um pacote deve contar o arquivo "__init__.py" (Dunder Init)
  • No caso de uma aplicação Django, deve-se seguir toda a convenção do Django, tais como, models, tests, urls and views
  • Um pacote deve depender somente de si mesmo

Criando o Aplicativo

  1. Criar um App Django com um nome da sua escolha. Examplo: notificacoes
  2. Criar a pasta "templatetags" dentro do nosso novo app
  3. Criar o arquivo de template tag "notificacao.py" e criar o "dunder init"
  4. Deixaremos em branco por enquanto. Vamos adicionar o conteúdo depois

Configurando o Pacote

  • Criar um arquivo "setup.py" dentro do diretório raiz
  • Esse arquivo contem informações sobre o pacote. Por exemplo: name, version, packages, descripton e etc
  • Vamos escrever mais um pouco de código?
    # coding: utf-8
    import os
    from setuptools import setup
    current_dir = os.path.abspath(os.path.dirname(__file__))
    readme = open(os.path.join(current_dir, 'README.md')).read()
    setup(
        name='pythononrio-templatetags',
        version='1.0',
        packages=['notificacoes'],
        description='Templates Tags desenvolvidos no Python On Rio',
        long_description=readme,
        author='Élysson MR',
        author_email='elyssonmr@gmail.com',
        url='https://github.com/elyssonmr/django_pkg/',
        license='MIT',
        install_requires=[
            'Django>=1.8',
        ]
    )
        

Configurando o Pacote

  • Finalmente é necessário um arquivo manifest com os arquivos que gostariamos de distribuir
  • Criar um arquivo chamado MANIFEST.in dentro da pasta raiz do projeto:
    
    include *.md
    recursive-include notificacoes *.py *.html
            					

Instalando o Pacote

  • Agora o pacote já está pronto para ser instalado
  • Para isso basta rodar o comando "python setup.py develop"
  • Se tive tiver sido instalado corretamente, a seguinte mensagem será exibida:
    $ python setup.py develop
    ...
    Installed /path/to/project/django_pkg
    Processing dependencies for django-templatetags==1.0
    Searching for Django==1.8.5
    Best match: Django 1.8.5
    Adding Django 1.8.5 to easy-install.pth file
    Installing django-admin script to /home/user/.virtualenvs/venv/bin
    
    Using /home/user/.virtualenvs/venv/lib/python2.7/site-packages
    Finished processing dependencies for django-templatetags==1.0
                                

E agora?

  • Agora o pacote esta pronto para ser distribuído
  • Antes precisamos adicionar o código! Certo? ;D
  • Depois poderemos distribu-lo para todo mundo!!!

Codificando algumas template tags

  • O primeiro passo é criar o arquivo notification/templatetags/notify.py com o código:
    # coding: utf-8
    
    from django import template
    
    register = template.Library()
    
    
    @register.inclusion_tag('notificacoes/notification.html')
    def render_notification():
        return {}
    
    
    @register.filter
    def format_hello(value, nome):
        return value % (nome)

Codificando algumas template tags

  • Vamos criar o arquivo HTML notificacoes/templates/notificacoes/notificacao.html para ser usado junto com a nossa template tag:

    Oi eu sou uma notificação!

Testanto as template tags

  • Não há necessidade de criar uma aplicação django completa para testar o código, é necessário criar somente um settings para ser usado nos testes
  • Por exemplo: criando o arquivo test_settings.py dentro da raiz do nosso projeto para que possamos executar os testes usando: "$ python django-admin.py test --settings=test_settings"
  • É necessário adicionar algumas linhas no "test_settings.py":
    INSTALLED_APPS = (
        'notificacoes',
    )
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': ':memory:',
        }
    }
    SECRET_KEY = "ultra_secret_key_for_testing"

Testando as template tags

  • Para testar as template tags precisamos de algo assim no módulo notificacoes/test.py:
# coding: utf-8
from django.test import TestCase
from django.template import Context
from django.template import Template

class TemplateTagTest(TestCase):
    def setUp(self):
        self.template = Template('{% load notify %} {% render_notification %}')

    def test_templatetag_inclusion(self):
        rendered = self.template.render(Context())
        self.assertIn(u'sou uma notificação', rendered)

class FilterTest(TestCase):
    def setUp(self):
		self.template = Template(u'{% load notify %}' +
			u' {{ "Oi %s, Como você esta?"|format_hello:"Élysson MR" }}')

    def test_filter(self):
        rendered = self.template.render(Context())
        self.assertIn(u'Élysson MR', rendered)

Distribuíndo

  • Agora que tudo esta pronto, podemos distribuir nosso pacote para todo mundo
  • Mas antes teremos que regitrar uma nova Conta PyPi
  • Após o registro, devemos abrir o terminal e rodar "python setup.py register"
  • Seleciona a opção "1", entrar com o usuário e a senha e o pacote será registrado
  • Para finalizar temos que enviar todos os arquivos para o servidor do PyPi rodando "python setup.py sdist upload"

Agora Sim!!

  • Todo mundo poderá usar o nosso pacote usando o comando "pip install pythononrio-templatetags"
  • Para usa-lo, basta adicionar o app na configuração INSTALLED_APPS do settings do Django
  • Para enviar uma atualização basta somente utilizar o comando de upload outra vez, lembre-se de alterar a versão do seu "setup.py"

Conclusão

  • O processo para criar um pacote é bem simples
  • Diversas vezes nós codificamos para resolver os mesmos problemas, porque não escrever um pacote para isso?
  • Usando pacotes podemos compartilhar com outros desenvolvedores diversas soluções para problemas comuns

Referências

Muito Obrigado!!

Élysson Mendes Rezende