sábado, 12 de setembro de 2015

Aplicação Django, Python3, PostgreSQL no Xubuntu

Neste post trataremos da instalação, criação e configuração de um pequeno exemplo de sistema em Python3 utilizando o banco de dados PostgreSQL. Vou ser breve no conteúdo textual, mas preciso na declaração dos comandos e arquivos necessários.

Como premissas, é importante saber que não estou realizando a instalação como root. Isso significa que você verá o comando sudo a todo instante. Em alguns pontos mantive comandos para atribuir ao meu usuário (guilherme) a propriedade e/ou permissão necessária nos diretórios. Adapte isso ao seu usuário. É importante notar também que utilizei esses dados para uma aplicação que estou construindo (com exceção das senhas e informações que poderiam comprometer a segurança do sistema, é claro). Você também deve adaptar tais dados de acordo com sua necessidade. Bom, então é isso, vamos lá...

Primeiro vamos instalar o vim. Precisaremos dele durante a configuração. Aproveito também para explicar que todo o conteúdo desta mini-aplicação exemplo estará disposta no diretório /opt/python. Até o conteúdo web? Sim.

Nota: você pode estar se perguntando por que não colocar esta app python na /var/www. Geralmente publicamos na /var/www conteúdo que os usuários do sistema poderiam acessar com plenitude. Isso representa um risco aos apps python pelo fato de que os usuários poderiam acessar os arquivos fontes do sistema - fato que devemos evitar.

sudo apt-get vim 
cd /opt/
sudo mkdir python
sudo chown guilherme:guilherme python
cd python

Agora vamos instalar o PostgreSQL.

sudo apt-get install -y libpq-dev build-essential binutils g++
sudo apt-get install -y postgresql-9.4 postgresql-contrib-9.4
sudo apt-get install -y pgadmin3

Repare que estou instalando o pgadmin3, que trata-se de uma ferramenta gráfica para gerenciamento e utilização do PostgreSQL. Neste tutorial não entraremos em detalhes de sua utilização. Ao executar o comando abaixo, você deve visualizar a versão do PostgreSQL.

psql -V

Agora, seguimos com a configurar o banco da aplicação. Os comandos abaixo criarão um usuário chamado "aplicacao" e um banco chamado "banco". Em seguida, através do terminal psql, os privilégios de acesso ao "banco" serão dados ao usuário.

sudo su - postgres
createdb banco
createuser -P aplicacao
psql banco
GRANT ALL PRIVILEGES ON DATABASE banco TO aplicacao;
\q
exit


Vamos agora à instalação do Python.

wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tar.xz
tar -Jxf Python-3.4.3.tar.xz
cd Python-3.4.3
sudo apt-get build-dep python3
sudo ./configure
sudo make
sudo make install


Após a instalação (que pode demorar), vamos entrar no prompt do python para testar.

python3.4
exit()

Em algumas distribuições Linux o Python2 já vem instalado. Neste tutorial estaremos utilizando o Python3. O problema é que se você simplesmente digitar o comando python do console, a versão precedente no PATH será a 2. Para facilitar a utilização dos comandos (e para que você não se engane), vamos criar um alias que seja considerado antes mesmo do comando python2 default do PATH. Dessa forma, ao digitar python, você já executará o Python3.

Para realizar essa configuração, acrescente o "alias python=python3" no final do arquivo /home/guilherme/.bashrc conforme o comando abaixo.

printf "\nalias python=python3\n" >> /home/guilherme/.bashrc
source ~/.bashrc

Vamos instalar o PIP, que é um programa que serve para instalar e gerenciar pacotes Python. O virtualenv também será instalado na sequência. Ele serve para criar um ambiente isolado dentro do sistema e permitir que os pacotes sejam instalados dentro do ambiente virtual. Não vamos utilizá-lo neste tutorial, mas você provavelmente vai usá-lo em outros projetos Python.

mkdir pip
cd pip
wget https://bootstrap.pypa.io/get-pip.py
sudo python3.4 get-pip.py
cd ..
pip install virtualenv


Ok, agora vamos instalar o pacote python3-psycopg2 que permitirá o Python3 acessar o banco PostgreSQL.

sudo apt-get install python3-psycopg2
sudo apt-get build-dep python3-psycopg2
sudo pip install psycopg2


Para permitir o acesso, será necessário fazer uma configuração no meio de acesso ao banco através do arquivo pg_hba.conf. Acesse o arquivo:

sudo vim /etc/postgresql/9.4/main/pg_hba.conf

Substitua a linha abaixo (primeira linha descomentada do arquivo)
local   all             postgres               peer
por
local   all             all                    md5

Pronto. Reinicie o PostgreSQL.

/etc/init.d/postgresql restart

Vamos testar o acesso através do prompt do Python.

python

Dentro do prompt, execute os comandos abaixo. Estou propositalmente separando-os por quebras de linhas extras pois alguns comandos podem ocupar mais de uma linha no seu browser - mas todos são comandos de uma única linha.

import psycopg2

conn = psycopg2.connect("dbname=banco user=aplicacao password=123eja")

cur = conn.cursor()

cur.execute("CREATE TABLE aviso (id serial PRIMARY KEY, texto text);")
conn.commit()

cur.execute("INSERT INTO aviso (ID,texto) VALUES (1, 'Aviso 1')")
cur.execute("INSERT INTO aviso (ID,texto) VALUES (2, 'Aviso 2')")
conn.commit()

cur.execute("SELECT * FROM aviso;")
cur.fetchall()

cur.execute("DROP TABLE aviso;")
conn.commit()

cur.close()
conn.close()
exit()


Veja o resultado:


Ok. Agora vamos instalar o Django.

sudo pip install Django

Vamos criar um diretório git para depois ficar mais intuitivo que este trecho estará versionado no github (ou bitbucket). Nosso projeto Django será criado dentro deste diretório.

cd /opt/python
mkdir git
cd git
django-admin startproject ipbprimavera
cd ipbprimavera


Veja o resultado do diretório do projeto.

sudo apt-get install tree
tree .



Vamos realizar a configuração para acesso ao banco de dados. Para isso, acesse o arquivo settings.py e atualize as configurações padrões para o conteúdo abaixo.

vim ipbprimavera/settings.py

Substitua o conteudo DATABASE pelo texto abaixo. Note que no vim, você precisa digitar a letra "i" ou a tecla INSERT antes de alterar o conteúdo do arquivo.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'banco',
        'USER': 'aplicacao',
        'PASSWORD': '123eja',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}


Aproveite também para alterar o língua padrão para Português do Brasil e o TIME_ZONE para o valor da sua localização. Estou apontando para o TIME_ZONE de São Paulo. Você poderá escolher o seu TIME_ZONE em https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Altere de
LANGUAGE_CODE = 'en-us'
para
LANGUAGE_CODE = 'pt-br'

E também de
TIME_ZONE = 'UTC'
para
TIME_ZONE = 'America/Sao_Paulo'

Salve o arquivo (no vim, para salvar o arquivo corrente utilize a sequência ESC + :wq + ENTER). Vamos configurar o banco de dados com as apps default instaladas em uma aplicação Django. Para isso, utilize o comando abaixo.

python manage.py migrate

Vamos ver o que foi criado no banco?

psql -d banco -U aplicacao

Digite a senha. Depois visualize as tabelas criadas.

\dt


\q

Vamos ver se está funcionando?

python manage.py runserver


Acesse http://localhost:8000/ em seu navegador favorito.


Show de bola! Finalize o servidor com um comando CTRL+C. Vamos criar agora uma funcionalidade fictícia para cadastro de avisos.

python manage.py startapp avisos
cd avisos
tree .



Vamos criar o modelo acessando o arquivo models.py.

cd ..
vim avisos/models.py


Copie o conteúdo abaixo para o arquivo.

from django.db import models

class Aviso(models.Model):
    texto = models.CharField(max_length=300)
    data = models.DateTimeField()


Salve o arquivo. Vamos acrescentar nossa app de avisos à projeto principal. Para isso, alteramos o arquivo settings.py.

vim ipbprimavera/settings.py

Acrescente 'avisos' na diretiva INSTALLED_APPS, deixando-o conforme abaixo.

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'avisos',
)


Salve o arquivo. Vamos avisar ao Django que há mudanças no modelo para que o passo de migrate aplique-as ao banco.

python manage.py makemigrations avisos

Veja o SQL criado com o comando abaixo.

python manage.py sqlmigrate avisos 0001


Por fim. Vamos aplicar as alterações.

python manage.py migrate

Vamos confirmar as alterações no banco?

psql -d banco -U aplicacao
\dt



Saia do psql. Para criar um usuário administrador, utilizaremos o parâmetro createsuperuser.

\q
python manage.py createsuperuser

Eu utilizei os dados abaixo, mas adapte-os para suas necessidades.

Username: admin
Email address: admin@admin.com.br
Password: 123eja


Por fim, vamos adicionar a app de Avisos ao painel de administração da aplicação principal. Para isso, acessa o arquivo admin.py.

vim avisos/admin.py

Altere seu conteúdo para:

from django.contrib import admin

from .models import Aviso

admin.site.register(Aviso)


Salve o arquivo e rode o servidor.

python manage.py runserver

Acese a tela de administração através do link http://127.0.0.1:8000/admin/


 Acesse com usuário 'admin' e senha '123eja'.


Veja que além das funcionalidades padrões, o módulo de Avisos já está disponível. Vamos criar um registro de um aviso, conforme abaixo.


Após o cadastro, clique em Salvar. Vamos verificar no banco? Finalize o servidor (CTRL + C) e execute os comandos abaixo.

psql -d banco -U aplicacao
select * from avisos_aviso;


\q

Pronto! Este foi um pequeno exemplo de aplicação Django com Python3 utilizand o banco PostgreSQL. Daqui em diante você pode evoluir para sua aplicação sem muitos problemas.

Muito obrigado pela leitura! xD

"Eu não finjo ser uma pessoa que não sou, apenas não faço coisas que vou me arrepender depois." - Wolverine

Um comentário: