You are on page 1of 95

SOCIEDADE EDUCACIONAL DE SANTA CATARINA - SOCIESC

INSTITUTO SUPERIOR TUPY - IST

FABIO EDUARDO THOMAZ

ESTUDO DO FRAMEWORK DJANGO E DA SUA UTILIZAO NO DESENVOLVIMENTO DE


UMA APLICAO WEB PARA O CONTROLE DE ALOCAO DOS PROFESSORES DO
INSTITUTO SUPERIOR TUPY

Joinville
2007/1

FABIO EDUARDO THOMAZ

ESTUDO DO FRAMEWORK DJANGO E DA SUA UTILIZAO NO DESENVOLVIMENTO DE


UMA APLICAO WEB PARA O CONTROLE DE ALOCAO DOS PROFESSORES DO
INSTITUTO SUPERIOR TUPY

Esse trabalho ser apresentado ao Instituto Superior Tupy como requisito parcial para a obteno
de grau de bacharel em Sistemas de Informao,
sob orientao do Professor MSc. Marco Andr
Lopes Mendes.

Joinville
2007/1

FABIO EDUARDO THOMAZ

ESTUDO DO FRAMEWORK DJANGO E DA SUA UTILIZAO NO DESENVOLVIMENTO DE


UMA APLICAO WEB PARA O CONTROLE DE ALOCAO DOS PROFESSORES DO
INSTITUTO SUPERIOR TUPY

Esse trabalho foi julgado e aprovado em


sua forma final pela banca examinadora
abaixo assinada.

Joinville, 25 de junho de 2007

Prof. MSc. Marco Andr Lopes Mendes

Prof. MSc. Elvis Pftzenreuter

Prof. Esp. Eduardo da Silva

THOMAZ, FABIO EDUARDO ESTUDO DO FRAMEWORK DJANGO E DA SUA UTILIZAO NO DESENVOLVIMENTO DE UMA APLICAO WEB PARA O CONTROLE
DE ALOCAO DOS PROFESSORES DO INSTITUTO SUPERIOR TUPY
Joinville: SOCIESC, 2007/1.

Aos meus pais, a minha noiva Muriel e a


todos aqueles que me deram foras para
concluir mais esta etapa da minha vida

AGRADECIMENTOS

Agradeo a Deus por ter me dado foras para chegar at aqui. Agradeo a toda a
minha famlia pelo incentivo constante minha formao acadmica. Agradeo ainda minha
noiva, Muriel Mller, que soube compreender minha ausncia durante o desenvolvimento deste
trabalho e me motivou a seguir em frente nos momentos em que pensei em desistir. Aos meus
tios, Joo Paulo Gesser e Jos Srgio Gesser, que me deram a oportunidade de iniciar a minha
vida profissional. Datasul Tecnologia, por ter me dado um um perodo de frias que auxiliou
na concluso deste trabalho. Aos meus amigos, que sempre mostraram-se dispostos a me
ajudar quando precisei. A todos os professores que j tive, que souberam compartilhar suas
experincias e conhecimentos comigo e com todos os outros alunos. Ao pessoal do grupo
Django Brasil, que ajudaram-me a dirimir dvidas e compartilharam as suas experincias com
o Django.
Aos professores Marco Andr Lopes Mendes, Mehran Misaghi, Sandro Jos de Oliveira
e Eduardo da Silva, que souberam cobrar, instruir, corrigir e motivar o desenvolvimento deste
trabalho.
A todos, muito obrigado.

A mente que se abre a uma nova idia jamais voltar ao seu


tamanho original
Albert Einstein

RESUMO

Com a crescente necessidade de diminuir prazos no desenvolvimento e elevar a qualidade das


aplicaes desenvolvidas, muitas empresas de desenvolvimento de software e desenvolvedores
independentes buscam ferramentas que lhes auxiliem durante o processo de desenvolvimento.
A proposta do framework Django, que ser apresentado neste trabalho, atender a essas
necessidades. Alm de demostrar as principais funcionalidades do framework, sero abordados alguns conceitos preliminares ao seu aprendizado, como a metodologia MVC, a linguagem
Python, HTML, JavaScript, CSS. Ser ainda desenvolvida uma aplicao para controlar a alocao de professores de uma instituio de ensino, como um estudo de caso da utilizao do
framework Django.
Palavras chave: Django, Python, Programao, Web

ABSTRACT

Nowadays, companies and independent developers are always looking for ways to reduce the
time of development and raise the quality of their software applications. They look for tools that
help the development process. This paper will present the Django Framework, whose purpose is
to meet those needs of decreasing the time of development and increase the quality of application. This paper will present the main features of the framework and some preliminary concepts
as the MVC methodology, Python language, HTML, JavaScript and CSS. An application will also
be developed to control teacher allocation at a school, as a case study of the use of Django
Framework.
Keywords: Django, Python, Programming, Web

Lista de Figuras

Figura 1 - Funcionamento de uma aplicao Web


Figura 2 - Fluxo entre as camadas no padro MVC

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

Figura 3 - Verificao de palndromo escrito na linguagem Python

. . . . . . . . . . . . . . . . . . . . 22

Figura 4 - Verificao de palndromo escrito na linguagem C++

. . . . . . . . . . . . . . . . . . . . . . . 23

Figura 5 - Verificao de palndromo escrito na linguagem Java

. . . . . . . . . . . . . . . . . . . . . . 24

Figura 6 - Exemplo de cdigo HTML

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

Figura 7 - Documento HTML visualizado no navegador

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Figura 8 - Vinculando o evento de clique de um boto a uma funo JavaScript


Figura 9 - Arquivo style.css

. . . . . . 27

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

Figura 10 - Documento HTML utilizando o arquivo style.css

. . . . . . . . . . . . . . . . . . . . . . . . . . . 28

Figura 11 - Resultados da execuo atravs do modelo CGI

. . . . . . . . . . . . . . . . . . . . . . . . . . . 30

Figura 12 - Resultados da execuo atravs do mdulo mod_python


Figura 13 - Comparao de desempenho entre CGI e mod_python

. . . . . . . . . . . . . . . . . . 31
. . . . . . . . . . . . . . . . . . . . 31

Figura 14 - Tecnologias utilizadas por uma aplicao Web desenvolvida com Django
Figura 15 - Execuo do script de instalao do Django

. . 32

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

Figura 16 - Criao de um projeto com o script django-admin.py


Figura 17 - Execuo do servidor Web do framework Django
Figura 18 - Acesso ao servidor de desenvolvimento do Django

. . . . . . . . . . . . . . . . . . . . . . . 34

. . . . . . . . . . . . . . . . . . . . . . . . . . 35
. . . . . . . . . . . . . . . . . . . . . . . . 36

Figura 19 - Criao da aplicao Professores com o script manage.py

. . . . . . . . . . . . . . . . . 36

Figura 20 - Configuraes alteradas para o projeto piramide no arquivo settings.py


Figura 21 - Definio do modelo de dados Professor no arquivo models.py
Figura 22 - Verificao dos modelos de dados com o script manage.py

. . . . 39

. . . . . . . . . . . . 40

. . . . . . . . . . . . . . . . 41

Figura 23 - Verificao dos comandos SQL gerados com base nos modelos de dados
Figura 24 - Resultado da execuo do script manage.py com a opo sqlall

. 41

. . . . . . . . . . . 42

Figura 25 - Criao das tabelas no banco de dados de acordo com os modelos de dados
Figura 26 - Definio do modelo Titulao e relacionamento com o modelo Professor

42
. . 43

Figura 27 - Relacionamento utilizando parmetro string

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Figura 28 - Inicializao do console interativo do Projeto

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

Figura 29 - Criao de um registro na tabela Titulao


Figura 30 - Alterao de um registro na tabela Titulao

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

Figura 31 - Alterao de um registro utilizando o mtodo get()

. . . . . . . . . . . . . . . . . . . . . . . . . 47

Figura 32 - Consulta a todos os registros da tabela Titulacao com o mtodo all()

. . . . . . . 48

Figura 33 - Ordenao dos registros de uma consulta com o mtodo order_by()

. . . . . . . 48

Figura 34 - Consulta condicional aos registros da tabela Titulacao

. . . . . . . . . . . . . . . . . . . . . 49

Figura 35 - Utilizao da condio gte na consulta aos registros da tabela Titulacao


Figura 36 - Ativando a interface de administrao nos modelos de dados
Figura 37 - Configurao para ativar a interface de administrao

. . . . . . . . . . . . . . 52

. . . . . . . . . . . . . . . . . . . . . . 53

Figura 38 - Configurao de URL para ativar a interface de administrao


Figura 39 - Interface de administrao do Django

. . . . . . . . . . . . . 53

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

Figura 40 - Alterao do nome do modelo de dados Titulacao no plural


Figura 41 - Pgina principal da interface de administrao do Django
Figura 42 - Listagem dos registros da tabela Professor

. . . . . . . . . . . . . . . . 54
. . . . . . . . . . . . . . . . . . 55

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Figura 43 - Validao dos campos na insero de um registro na tabela Professor


Figura 44 - View definida no arquivo views.py

. . . . . 56

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Figura 45 - Configurao de URL mapeada para a view datahora_atual


Figura 46 - Acesso ao endereo relacionado view datahora_atual
Figura 47 - Passagem de parmetros pela URL

. . . 49

. . . . . . . . . . . . . . . 58

. . . . . . . . . . . . . . . . . . . 59

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

Figura 48 - Parmetros na definio da view datahora_atual


Figura 49 - View para retornar dados no formato XML

. . . . . . . . . . . . . . . . . . . . . . . . . . . 59

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

Figura 50 - Utilizao de blocos, variveis e contextos em templates


Figura 51 - Configurao da opo TEMPLATE_DIRS

. . . . . . . . . . . . . . . . . . . 62

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

Figura 52 - Template para listar os registros da tabela Titulacao

. . . . . . . . . . . . . . . . . . . . . . . 63

Figura 53 - View para listar os registros da tabela Titulacao

. . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Figura 54 - Configurao da URL para a view lista_titulacao

. . . . . . . . . . . . . . . . . . . . . . . . . . . 64

Figura 55 - Lista com os registros da tabela Titulacao


Figura 56 - Definio de um formulrio para contato

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

Figura 57 - Criao do formulrio para cadastro na tabela Professor

. . . . . . . . . . . . . . . . . . . 66

Figura 58 - Template com o formulrio para cadastro na tabela Professor


Figura 59 - Configurao do servidor Apache

. . . . . . . . . . . . . . 67

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

Figura 60 - Link simblico para os arquivos estticos da interface de administrao


Figura 61 - Modelo Entidade Relacionamento do projeto piramide
Figura 62 - Pgina de acesso aplicao

. . . . 69

. . . . . . . . . . . . . . . . . . . . . 72

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Figura 63 - Pgina inicial da aplicao

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Figura 64 - Relatrio de carga horria

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

Lista de Tabelas

Tabela 1 - Tipos de campo utilizados no modelo de dados Professor


Tabela 2 - Tipos de relacionamento disponveis no framework Django

. . . . . . . . . . . . . . . . . . 40
. . . . . . . . . . . . . . . . . 43

Tabela 3 - Condies de consulta aos dados

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

Tabela 4 - Exemplos de expresses regulares

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

SUMRIO

1 INTRODUO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16

2 CONCEITOS PRELIMINARES

18

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1 DESENVOLVIMENTO DE APLICAES PARA A WEB

. . . . . . . . . . . . . . .

18

2.2 PADRO DE DESENVOLVIMENTO MVC . . . . . . . . . . . . . . . . . . . . . . .

20

2.3 FRAMEWORK DE DESENVOLVIMENTO DE APLICAES . . . . . . . . . . . . .

21

2.4 LINGUAGEM DE PROGRAMAO PYTHON

. . . . . . . . . . . . . . . . . . . .

22

. . . . . . . . . . . . . . . . . . . . . . . . .

25

2.5 HYPERTEXT MARKUP LANGUAGE

2.6 LINGUAGEM DE PROGRAMAO JAVASCRIPT

. . . . . . . . . . . . . . . . . .

26

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

2.8 SISTEMA GERENCIADOR DE BANCO DE DADOS MYSQL . . . . . . . . . . . . .

29

2.8.1 MySQLdb - Integrao entre MySQL e Python . . . . . . . . . . . . . . . . . . . .

29

2.9 SERVIDOR WEB APACHE

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

2.7 CASCADING STYLE SHEETS

2.9.1 Mdulo Mod_Python

2.10RELACIONAMENTO ENTRE AS TECNOLOGIAS UTILIZADAS PELO DJANGO

. .

31

3 DJANGO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

3.1 VISO GERAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

3.2 CARACTERSTICAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

3.3 INSTALAO DO FRAMEWORK DJANGO . . . . . . . . . . . . . . . . . . . . . .

34

3.4 DESENVOLVIMENTO DE UMA APLICAO WEB . . . . . . . . . . . . . . . . . .

34

3.5 CONFIGURAES DO PROJETO

37

. . . . . . . . . . . . . . . . . . . . . . . . . .

3.6 DEFINIO DOS MODELOS DE DADOS


3.7 ACESSO AOS DADOS

. . . . . . . . . . . . . . . . . . . . . .

39

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

3.7.1 Criao e Atualizao de Registros

. . . . . . . . . . . . . . . . . . . . . . . . .

45

3.7.2 Consulta ao Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

3.7.3 Excluso de Registros

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

51

3.8 INTERFACE DE ADMINISTRAO . . . . . . . . . . . . . . . . . . . . . . . . . .

51

3.9 VIEWS E CONFIGURAO DAS URLS

. . . . . . . . . . . . . . . . . . . . . . .

56

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

3.10TEMPLATES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61

3.11MANIPULAO DE FORMULRIOS . . . . . . . . . . . . . . . . . . . . . . . . .

65

3.12PUBLICAO NO SERVIDOR WEB APACHE

67

3.9.1 AJAX

. . . . . . . . . . . . . . . . . . . .

4 ESTUDO DE CASO: APLICAO WEB UTILIZANDO DJANGO

. . . . . . . . . . .

70

4.1 VISO GERAL DA APLICAO . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

4.2 REQUISITOS

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

4.3 NDICE DE TITULAO DO CORPO DOCENTE . . . . . . . . . . . . . . . . . . .

71

4.4 MODELAGEM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71

4.5 DESENVOLVIMENTO DA APLICAO . . . . . . . . . . . . . . . . . . . . . . . .

72

4.6 RESULTADOS OBTIDOS

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

4.7 DIFICULDADES ENCONTRADAS . . . . . . . . . . . . . . . . . . . . . . . . . . .

75

5 CONCLUSO

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

REFERNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

APNDICE A -- MODELO DE DADOS DA APLICAO PROFESSORES . . . . . . . .

80

APNDICE B -- MODELO DE DADOS DA APLICAO INSTITUIES

. . . . . . . .

82

. . . . . . . . .

83

. . . . . . . . . . . . . . . . . . . . . .

84

APNDICE E -- LGICA DOS RELATRIOS . . . . . . . . . . . . . . . . . . . . . . .

85

APNDICE F -- TEMPLATE BASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

89

APNDICE G -- TEMPLATE CARGA HORRIA

92

APNDICE C -- MODELO DE DADOS DA APLICAO ALOCAES


APNDICE D -- CONFIGURAO DAS URLS

. . . . . . . . . . . . . . . . . . . . .

16

INTRODUO

H alguns anos a Internet tem sido o foco na estratgia das empresas em busca do
crescimento e da consolidao dos seus negcios. Com isso, a demanda por profissionais com
o conhecimento necessrio para o desenvolvimento de solues Web continua crescendo.
Em funo dessa demanda, necessrio que desenvolvedores e profissionais que pretendem entrar no mercado de desenvolvimento conheam um vasto conjunto de linguagens
de programao, ferramentas e metodologias para o desenvolvimento de aplicaes. Porm,
devido dificuldade de encontrar materiais na lngua portuguesa sobre determinada tecnologia, muitos acabam perdendo a oportunidade de adquirir novos conhecimentos, pela falta de
conhecimentos em outras lnguas, dentre elas e principalmente a lngua inglesa.
Uma das maiores dificuldades das empresas de desenvolvimento de aplicaes atender aos prazos dos clientes, que so cada vez menores. Para conseguir alcanar os prazos,
muitos acabam baixando a qualidade de suas aplicaes, fazendo menos testes do que o necessrio, implementando funcionalidades importantes sem um estudo adequado e deixando de
documentar o cdigo fonte desenvolvido. Os problemas causados por estas escolhas so o
aumento no nmero de erros na aplicao, insatisfao do cliente, dificuldade de manuteno
e retrabalho.
Na tentativa de resolver esses problemas, so utilizados frameworks de desenvolvimento
de aplicaes. Os frameworks fornecem uma estrutura para que o desenvolvimento se torne
mais rpido, organizado e para que o produto desenvolvido possua qualidade e fcil manuteno. Um framework procura reunir funcionalidades comuns a vrias aplicaes, de forma que
o desenvolvedor codifique pequenas partes, que pertecem ao domnio de problema especfico
da aplicao.
O Django um framework de alto nvel, desenvolvido na linguagem Python, e tem por
objetivo agilizar e facilitar o desenvolvimento de aplicaes Web, sem perder a qualidade e a
organizao do cdigo da aplicao. Esse framework automatiza algumas tarefas que podem
complicar e confundir a linha de raciocnio de um iniciante, alm de estruturar a aplicao em
camadas, conforme a metodologia Model, View, Controller conhecida como MVC.
O objetivo deste trabalho realizar um estudo do framework Django, servindo como
referncia no seu aprendizado, reunindo as suas principais funcionalidades e detalhando-as
com exemplos e com o desenvolvimento de uma aplicao exemplo. A aplicao escolhida ser
utilizada para controlar a alocao dos professores de uma instituio de ensino.

17

As atividades necessrias para a construo deste trabalho foram desenvolvidas no sistema operacional Linux, com o kernel verso 2.6.17.13. A distribuio utilizada foi o Slackware
Linux, verso 10.2. Para o desenvolvimento dos exemplos e da aplicao do estudo de caso,
foi utilizada a reviso 5318 da verso de desenvolvimento do framework Django e a linguagem
Python, verso 2.4.1. O navegador Internet utilizado para testar os exemplos e a aplicao desenvolvida foi o Firefox, verso 2.0.0.4. O trabalho foi escrito utilizando LATEX com o editor Kile,
verso 1.9.3. Todas as imagens e cdigos disponveis no trabalho que no possuem referncia
foram desenvolvidos pelo autor deste trabalho. Para a criao das imagens, foram utilizados
o Microsoft Visio 2003, no sistema operacional Windows XP, e o editor de imagens GIMP. Os
cdigos dos exemplos e da aplicao foram escritos com o editor de textos Kate, verso 2.5.4.
Este trabalho foi dividido da seguinte forma:
No captulo 2 sero abordados conceitos preliminares, nos quais se incluem a arquitetura de uma aplicao Web, as tecnologias envolvidas no processo de desenvolvimento de uma
aplicao Web, as aplicaes necessrias para o funcionamento de uma aplicao desenvolvida com o framework Django e como estes componentes funcionam em conjunto.
No captulo 3 sero detalhadas as principais caractersticas e funcionalidades do framework Django, desde a sua instalao at o desenvolvimento de uma aplicao Web. Sero
utilizados exemplos que, ao final, faro parte da aplicao desenvolvida no estudo de caso.
No captulo 4 ser apresentado o estudo de caso do desenvolvimento de uma aplicao
para a alocao de professores em uma instituio de ensino. Sero apresentados os requisitos da aplicao, a modelagem das tabelas identificadas e a aplicao desenvolvida com o
framework Django.
Finalizando o trabalho, sero apresentadas as concluses, incluindo as principais vantagens e as dificuldades encontradas durante o desenvolvimento da aplicao com o framework
Django. Sero apresentadas tambm algumas sugestes para trabalhos futuros.

18

CONCEITOS PRELIMINARES

Este captulo apresenta a arquitetura de uma aplicao Web, as tecnologias envolvidas no processo de desenvolvimento de uma aplicao Web, as aplicaes necessrias para o
funcionamento de uma aplicao desenvolvida com o framework Django e como esses componentes funcionam em conjunto.

2.1

DESENVOLVIMENTO DE APLICAES PARA A WEB

No incio da Internet, todo o contedo existente na rede mundial de computadores era


esttico, ou seja, os documentos eram escritos manualmente e publicados nos servidores ligados Internet, sem que houvesse uma atualizao automtica do seu contedo. Com o passar
do tempo, a necessidade de atualizao do contedo publicado aumentou, fazendo com que
surgissem tecnologias para atender a necessidade da disponibilizao de contedo de forma
dinmica. Essa mudana fez com que simples documentos formatados se tornassem verdadeiras aplicaes, exibindo aos usurios dados armazenados em banco de dados e permitindo a
sua manipulao on-line.
Com o desenvolvimento dessas tecnologias, aplicaes que antes eram executadas em
um ambiente local, passaram a ser reescritas para que fosse possvel execut-las via Internet.
As vantagens da mudana incluem mobilidade, simplificao da infra-estrutura antes necessria
para que empresas com diversas filiais pudessem utilizar a mesma aplicao, facilidade de atualizao das aplicaes, j que no necessria a sua instalao na estao de cada usurio,
entre outras. Porm, a tarefa do desenvolvedor passou a contar com detalhes que no existiam
nas aplicaes com execuo local.
De acordo com (PRESSMAN, 2006), as aplicaes Web "envolvem uma mistura de publicao impressa e desenvolvimento de aplicaes, de comercializao e computao, de comunicaes internas e relaes externas, e de arte e tecnologia".
As seguintes caractersticas so encontradas na grande maioria das aplicaes Web
(PRESSMAN, 2006):

I. a interface da aplicao com o usurio exibida em um browser, tambm chamado de


navegador Internet;

19

II. as requisies enviadas pelo usurio atravs da interface so tratadas por um servidor
Web;
III. um grande nmero de usurios pode acessar a aplicao Web ao mesmo tempo;
IV. a quantidade de acessos aplicao Web pode mudar completamente entre um dia e
outro;
V. os usurios querem acesso na base de "24/7/365", ou seja, 24 horas por dia, 7 dias
por semana e 365 dias por ano, devido a diferena de fuso horrio entre os usurios da
aplicao, que podem estar em qualquer lugar do mundo;
VI. a evoluo da aplicao Web no se d por meio de verses planejadas e cronologicamente espaadas, e sim continuamente;
VII. necessidade de colocao no mercado rapidamente;
VIII. dificuldade em limitar a populao de usurios que podem ter acesso a uma aplicao
Web, sendo necessria a utilizao de fortes medidas de segurana em toda a infraestrutura que apia uma aplicao Web;
IX. a esttica possui grande influncia no sucesso da aplicao.

Durante a utilizao de uma aplicao Web, o usurio envia diversas requisies ao


servidor, seja para informar os dados da sua identificao, para acessar um modulo da aplicao
ou para alterar alguma informao disponvel na aplicao. O servidor Web, ao receber essas
requisies, identifica o que deve fazer com as mesmas. Caso seja necessria a execuo
de algum programa para a gerao de contedo dinmico, o servidor acessa a instncia deste
programa, enviando as informaes necessrias para a gerao do contedo e, ao receber o
retorno, encaminha o contedo ao usurio que disparou a requisio. A figura 1 exemplifica o
funcionamento de uma aplicao Web:

Figura 1: Funcionamento de uma aplicao Web

20

2.2

PADRO DE DESENVOLVIMENTO MVC

A MVC, sigla para os termo em ingls Model, View, Controller, significa Modelo, Visualizao e Controlador. um padro de desenvolvimento que sugere a separao do cdigo
fonte da aplicao em trs partes, tambm conhecidas por camadas, onde cada camada responsvel por tarefas especficas, facilitando o desenvolvimento e a manuteno do cdigo da
aplicao.

Figura 2: Fluxo entre as camadas no padro MVC


Fonte: Adaptado de (THOMAS; HANSSON, 2007)

A camada de Modelo responsvel por realizar a interface entre o banco de dados e a


aplicao. Nesta camada, so desenvolvidas todas as regras de negcio que se aplicam aos
dados, garantindo que nenhum objeto da aplicao efetue uma alterao com valores invlidos
no banco de dados (THOMAS; HANSSON, 2007). Por exemplo, em uma aplicao para vendas,
se existe uma regra de negcio que fornece 10% de desconto nos produtos vendidos vista,
a camada de Modelo pode realizar uma verificao no valor antes deste ser armazenado no
banco de dados, garantindo que o desconto seja aplicado.
A camada de Visualizao responsvel por exibir a interface para o usurio, permitindo
que este possa realizar a entrada de dados e a execuo de operaes. O padro sugere que
nesta camada no sejam implementadas regras de negcio da aplicao, visando facilitar a
manuteno e organizar o cdigo fonte.
A camada do Controlador responsvel por tratar as entradas e requisies do usurio,
interagir com os objetos da camada de Modelo e retornar os objetos de visualizao apropriados
ao usurio. O padro MVC sugere que todo o fluxo passe pelo Controlador, sendo que um
objeto da camada de visualizao no deve interagir com os objetos da camada de modelo
diretamente.

21

2.3

FRAMEWORK DE DESENVOLVIMENTO DE APLICAES

Um framework de desenvolvimento de aplicaes uma estrutura de suporte definida


para que outros projetos de software possam ser organizados e desenvolvidos. Geralmente, um
framework possui programas de apoio, bibliotecas de classes, colaborao entre os objetos,
scripts e outras ferramentas para auxiliar o desenvolvedor no processo de desenvolvimento
(WIKIPEDIA, 2006).
Um framework procura reunir funcionalidades comuns a vrias aplicaes, de forma
que o desenvolvedor codifique pequenas partes, que pertecem ao domnio de problema especfico da aplicao. Em uma aplicao Web baseada no padro MVC, a comunicao entre
os objetos da visualizao, do controlador e do modelo semelhante, independente do domnio de problema da aplicao. Portanto, um framework para o desenvolvimento de aplicaes
Web baseadas no padro MVC pode oferecer um conjunto de funcionalidades que facilitariam
o processo de desenvolvimento, deixando para o programador a tarefa de codificar a lgica de
negcio especfica da aplicao.
A utilizao de um framework no processo de desenvolvimento de aplicaes traz vrias
vantagens, tais como (SAUV, 2003):

I. maximizao do re-uso;
II. diminuio do tempo de desenvolvimento;
III. reduo de custos;
IV. estabilizao do cdigo, devido ao uso em vrias aplicaes;
V. desenvolvimento voltado a adicionar valor aplicao;
VI. melhor consistncia e compatibilidade entre aplicaes;
VII. diminuio e facilidade de manuteno.

A principal diferena entre um framework e uma biblioteca de classes que o framework


deve fornecer a colaborao entre os objetos, enquanto a biblioteca de classes fornece apenas
os objetos para a utilizao. Colaborao entre os objetos significa que os objetos utilizados
pelo framework possuem uma seqencia de execuo. O desenvolvedor no precisa saber
quando chamar cada mtodo. O prprio framework realiza este trabalho (SAUV, 2003).

22

2.4

LINGUAGEM DE PROGRAMAO PYTHON

Python uma linguagem de programao orientada objetos desenvolvida por Guido


van Rossum em meados da dcada de 1990, nos laboratrios da CWI, o Instituto Nacional
de Pesquisa em Matemtica e Cincia da Computao, localizado em Amsterd (DEITEL et al.,
2002).
Devido a algumas de suas caractersticas, como a sintaxe simples e o alto nvel de abstrao, a linguagem Python tem ganhado espao nas disciplinas introdutrias de programao
das instituies de ensino superior, onde o foco ensinar aos alunos o raciocnio lgico da
programao, sem perder tempo com os detalhes da tecnologia utilizada.
Um exemplo da utilizao da linguagem Python pode ser visto no cdigo de um programa para a verificao de palndromos. Um palndromo uma palavra ou frase que pode ser
lida tanto da direita para a esquerda como da esquerda para a direita. Nos palndromos normalmente so desconsiderados os sinais ortogrficos e os espaos entre as palavras (WIKIPEDIA,
2007a). O programa para a verificao de palndromos deve receber a palavra ou frase digitada
pelo usurio, remover os espaos entre as palavras, alterar o texto para conter apenas letras
minsculas, para que as letras maisculas no interfiram na comparao, inverter o texto e comparar com o original, verificando se o texto informado um palndromo ou no. Este exemplo
foi escolhido para apresentar o uso da manipulao de strings, uma prtica muito utilizada no
desenvolvimento de aplicaes.
O exemplo seguir mostra o cdigo do programa escrito na linguagem Python:

# coding : l a t i n 1

def i s P a l i n d r o m o ( l i n h a ) :

l i n h a = l i n h a . r e p l a c e ( " " , "" ) . l o w e r ( )

r e t u r n ( l i n h a == l i n h a [ : : 1 ] )

p r i n t "VERIFICAO DE PALNDROMOS"

l i n h a = r a w _ i n p u t ( "Digite a palavra ou frase (sem acentuao): " )

i f isPalindromo ( l i n h a ) :

9
10
11

p r i n t " palndromo"
else :
p r i n t "No palndromo"

Figura 3: Verificao de palndromo escrito na linguagem Python

23

O cdigo do programa contm apenas o que o programa deve fazer, ou seja, solicitar a
entrada do usurio, remover os espaos em branco, passar todo o texto para letra minscula e
realizar a comparao do texto informado com o texto invertido. O mesmo programa, escrito na
linguagem C++, ficaria conforme a figura 4.

# include < iostream >

# include < s t r i n g >

using namespace s t d ;

bool i s P a l i n d r o m o ( s t r i n g l i n h a ) {

s t r i n g : : size_type index ;

string auxiliar ;

f o r ( i n t i = 0 ; i < l i n h a . l e n g t h ( ) ; i ++) {

linha [ i ] = tolower ( linha [ i ] ) ;

10

11

index = l i n h a . f i n d ( " " , 0) ;

12

while ( i n d e x ! = s t r i n g : : npos ) {

13

l i n h a . r e p l a c e ( index , 1 , "" ) ;

14

index = l i n h a . f i n d ( " " , index + 1) ;

15

16

auxiliar = linha ;

17

r e v e r s e ( a u x i l i a r . begin ( ) , a u x i l i a r . end ( ) ) ;

18

r e t u r n ( a u x i l i a r == l i n h a ) ;

19

20

i n t main ( ) {

21

char i n p u t [ 1 0 0 ] ;

22

string linha ;

23

c o u t << "VERIFICAO DE PALNDROMOS" << e n d l ;

24

c o u t << "Digite a palavra ou frase (sem acentuao): " ;

25

cin . g e t l i n e ( input ,100) ;

26

linha = input ;

27

i f ( isPalindromo ( l i n h a ) ) {

28

c o u t << " palndromo" << e n d l ;

29

} else {

30

c o u t << "No palndromo" << e n d l ;

31

32

return 0;

33

Figura 4: Verificao de palndromo escrito na linguagem C++

24

A linguagem C++ requer que o programa esteja dentro de uma funo. Alm disso,
necessria a incluso das bibliotecas iostream e string. As chaves e os ponto-e-vrgula so
parte da liguagem. Na linguagem Java, todo cdigo deve estar dentro de uma classe, conforme
a figura 5.

import j a v a . i o . BufferedReader ;

import j a v a . i o . IOException ;

import j a v a . i o . InputStreamReader ;

public class Palindromo {

s t a t i c boolean i s P a l i n d r o m o ( S t r i n g l i n h a ) {

StringBuffer auxiliar ;

l i n h a = l i n h a . r e p l a c e ( " " , "" ) . toLowerCase ( ) ;

a u x i l i a r = new S t r i n g B u f f e r ( l i n h a ) ;

r e t u r n l i n h a . equals ( a u x i l i a r . r e v e r s e ( ) . t o S t r i n g ( ) ) ;

10

11

public s t a t i c void main ( S t r i n g argv [ ] ) {

12

BufferedReader i n p u t ;

13

i n p u t = new BufferedReader (new InputStreamReader ( System . i n ) ) ;

14

String linha ;

15

System . o u t . p r i n t l n ( "VERIFICAO DE PALNDROMOS" ) ;

16

try {

17

System . o u t . p r i n t ( "Digite a palavra ou frase (sem acentuao): " ) ;

18

l i n h a = i n p u t . readLine ( ) ;

19

i f ( Palindromo . i s P a l i n d r o m o ( l i n h a ) ) {

20

System . o u t . p r i n t l n ( " palndromo" ) ;

21

} else {

22

System . o u t . p r i n t l n ( "No palndromo" ) ;

23

24

input . close ( ) ;

25

} catch ( IOException e ) {

26

System . e r r . p r i n t l n ( e . getMessage ( ) ) ;

27

28
29

}
}

Figura 5: Verificao de palndromo escrito na linguagem Java

A linguagem Python permite a utilizao de funes e classes, mas no fora o programador a utiliz-las (ZELLE, 1999).

25

Outra caracterstica que torna a linguagem Python mais didtica a tipagem dinmica
das variveis. O programador no obrigado a definir o tipo da varivel antes de utiliz-la.
A prpria linguagem entende o tipo do valor que o programador deseja associar varivel e
determina o seu tipo, dinamicamente.
De acordo com (DEITEL et al., 2002), a linguagem Python oferece uma srie de vantagens,
citadas seguir:

I. uma linguagem excelente para iniciantes em programao e para o desenvolvimento de


aplicaes comerciais;
II. foi desenvolvida com o objetivo de ser portvel e extensvel;
III. a sua sintaxe promove o uso de boas prticas de programao;
IV. diminui o tempo utilizado no desenvolvimento de aplicaes sem ignorar questes importantes para a manuteno das mesmas.

2.5

HYPERTEXT MARKUP LANGUAGE

Uma pgina Web composta basicamente por texto e uma srie de marcaes (tambm
conhecidas como tags) da linguagem HTML, que so utilizadas para estruturar e formatar o contedo da pgina e criar ligaes entre vrias pginas diferentes. A sigla HTML um acrnimo
para Hypertext Markup Language, que significa Linguagem de Marcao de Hipertexto. Os
elementos da linguagem HTML so definidos pelo W3C Consortium, um instituto responsvel
por manter os padres de algumas das tecnologias utilizadas no desenvolvimento de aplicaes Web. Quando uma pgina Web carregada por um navegador Internet, o cdigo HTML
da pgina interpretado e o contedo exibido ao usurio, de acordo com as marcaes de
formatao definidas no cdigo.
A figura 6 mostra o cdigo-fonte com as marcaes HTML.

<html>

<body>

Exemplo de um < i >documento< / i > <b>HTML< / b>

< / body>

< / html>

Figura 6: Exemplo de cdigo HTML

26

A figura 7 mostra o documento interpretado e visualizado pelo navegador.

Figura 7: Documento HTML visualizado no navegador

A marcao <html> define o incio de um documento HTML. J a marcao <body>


define o incio do corpo do documento. As marcaes iniciadas com </ definem o fim de um
elemento, de forma que </body> define o fim do corpo do documento e </html> define o fim
do documento HTML.
A linguagem HTML possui vrias outras marcaes que no sero detalhadas nesse
trabalho. Porm, a Internet uma grande fonte de informaes para o aprendizado da linguagem HTML, sendo possvel analisar e estudar o cdigo fonte de qualquer pgina disponvel na
Web. Outras formas de encontrar informaes sobre a linguagem HTML so os mecanismos
de busca e os sites especializados no assunto. A referncia oficial da linguagem pode ser encontrada em (W3C, 1999a). Um guia rpido para o aprendizado da linguagem HTML pode ser
encontrado em (RAGGETT, 2005).

2.6

LINGUAGEM DE PROGRAMAO JAVASCRIPT

Conforme visto na seo anterior, a linguagem HTML no possui outra funo alm de
formatar o contedo das pginas Web e criar as ligaes entre as pginas. No ano de 1994, a
empresa Netscape sentiu a necessidade de processar dados na prpria pgina HTML, de forma
que no fosse necessrio o envio de uma requisio ao servidor para realizar operaes que
poderiam ser realizadas no prprio navegador do usurio. Um exemplo muito comum dentre
estas operaes a validao dos dados de um formulrio antes de envi-lo ao servidor. Partindo desta necessidade, a Netscape criou a linguagem LiveScript e adicionou o interpretador
no seu navegador, o Netscape Navigator. Em 1995, j com a participao da empresa Sun
Microsystems no projeto, o nome da linguagem foi mudado para JavaScript (GALDINO, 2006).
A figura 8 mostra um exemplo de cdigo JavaScript utilizado para vincular o clique de
um boto definido em uma pgina HTML a uma funo definida na linguagem JavaScript.

27

<button type="button" name="mybutton" value="10">

< s c r i p t type="text/javascript">

f u n c t i o n my_onclick ( ) {

. . .

document . form . mybutton . o n c l i c k = my_onclick

< / script>

< / button>

Figura 8: Vinculando o evento de clique de um boto a uma funo JavaScript


Fonte: (W3C, 1999b)

Segundo (GALDINO, 2006), a linguagem JavaScript foi criada para pequenos processamentos. Por este motivo, foi muito utilizada para acrescentar recursos simples pgina, s vezes banais. Esse uso o que a faz ser lembrada como uma extenso do HTML e no como uma
linguagem de fato. Porm, segundo o mesmo autor, a JavaScript uma linguagem completa
e poderosa, com as limitaes que o meio exige. A sua principal utilizao est relacionada
manipulao dos elementos da pgina HTML.
Um dos maiores problemas na utilizao da linguagem JavaScript est relacionado aos
diferentes interpretadores existentes. Alguns navegadores possuem comandos JavaScript especficos, fazendo com que uma pgina desenvolvida utilizando estes comandos deixe de funcionar corretamente em um navegador diferente.
Visando diminuir este problema, a European Computer Manufacturers Association (ECMA)
criou a especificao ECMAScript, para padronizar a linguagem JavaScript. Os scripts criados
de acordo com os padres definidos no ECMAScript devem funcionar de forma idntica em
qualquer navegador que implemente estas especificaes.

2.7

CASCADING STYLE SHEETS

CSS a sigla para Cascading Style Sheets, que significa Folha de Estilos em Cascata.
uma linguagem para estilos que define a disposio de documentos HTML (SILVA, 2007).
Embora seja possvel definir cores, fontes, posicionamento, e outros atributos relacionados com o estilo do documento utilizando a linguagem HTML, a utilizao do CSS proporciona
ao desenvolvedor vrias facilidades, centralizando todas as definies relacionadas ao estilo do

28

documento. A correta utilizao do CSS permite que o desenvolvedor mude o estilo de uma
aplicao Web por completo em poucos minutos.
A figuras 9 mostra um exemplo de um arquivo CSS.

body {
backgroundc o l o r : #FF0000 ;

2
3

Figura 9: Arquivo style.css


Fonte: (SILVA, 2007)

A figura 10 mostra a utilizao do CSS em um documento HTML, atravs do mtodo de


link.

1
2

<html>
<head>

< t i t l e >Meu documento< / t i t l e >

< l i n k r e l ="stylesheet" type="text/css" h r e f ="style.css" / >

< / head>

<body>

7
8
9

<h1>Minha p r i m e i r a f o l h a de e s t i l o s < / h1>


< / body>
< / html>

Figura 10: Documento HTML utilizando o arquivo style.css


Fonte: (SILVA, 2007)

O mtodo de link o recomendado para a utilizao de CSS, devido possibilidade


de centralizar a definio dos estilos em arquivos e utiliz-los em diversos documentos HTML.
Desta forma, a alterao de uma propriedade nos arquivos CSS far com que todos os documentos HTML que os utilizem sejam modificados.
Uma boa referncia na lngua portuguesa sobre a utilizao de CSS pode ser encontrada
em (SILVA, 2007).

29

2.8

SISTEMA GERENCIADOR DE BANCO DE DADOS MYSQL

O MySQL um SGBD (Sistema Gerenciador de Banco de Dados) de cdigo aberto


muito utilizado por aplicaes Web, em virtude de algumas de suas caractersticas como velocidade e facilidade de gerenciamento. O MySQL desenvolvido e distribudo pela MySQL AB,
uma empresa fundada pelos desenvolvedores do MySQL. (MYSQL AB, 2007)
Neste trabalho, o MySQL ser utilizado para armazenar os dados da aplicao desenvolvida com o framework Django no estudo de caso.
Os detalhes sobre a instalao e a utilizao da verso 5.1 do MySQL podem ser obtidos
no manual de referncia da ferramenta, disponvel em (MYSQL AB, 2007).

2.8.1

MySQLdb - Integrao entre MySQL e Python


Para que seja possvel utilizar o banco de dados MySQL atravs da linguagem Python,

necessria a instalao de um pacote de programas chamado de MySQLdb. Este pacote


fornece um conjunto de classes que possibilitam a conexo entre um programa escrito na linguagem Python e um banco de dados armazenado no MySQL.
Alm de possibilitar a conexo, as classes disponveis no pacote MySQLdb permitem
que os programas escritos na linguagem Python possam interagir com os dados armazenados
no banco de dados MySQL, seja consultando, inserindo, atualizando ou eliminando dados.

2.9

SERVIDOR WEB APACHE

Segundo o (WIKIPEDIA, 2007b), podemos chamar de Servidor Web tanto o hardware


como o programa responsvel por aceitar requisies HTTP e respond-las (THE INTERNET SOCIETY,

1999). O HTTP, sigla para o termo Hypertext Transfer Protocol, um protocolo de nvel

de aplicao utilizado para enviar e receber dados na Internet. A sua ltima verso foi definida
pela RFC 2616, disponvel em (THE INTERNET SOCIETY, 1999).
O Apache um servidor Web atualmente mantido por um grupo de voluntrios espalhados pelo mundo, que utilizam a Internet para se comunicar, planejar e desenvolver o servidor e
toda a documentao relacionada (APACHE SOFTWARE FOUNDATION, 2007). Atualmente, o servidor Web mais utilizado no mundo, possuindo cerca de 58% do mercado de servidores Web,
de acordo com os dados da Netcraft (NETCRAFT, 2007).

30

Dentre as suas principais caractersticas, se destaca o fato de ser uma aplicao multiplataforma, possuir um bom desempenho, robustez e flexibilidade (BAREINBOIM, 2006). A flexibilidade do Apache permite que sejam desenvolvidos mdulos para tratar de requisies que
necessitam de processamento por uma tecnologia externa, como aplicaes escritas nas linguagens PHP, Python, Ruby, entre outras.
Para que o Apache possa ser o servidor Web de uma aplicao desenvolvida com o
framework Django, necessria a utilizao do mdulo mod_python, explicado a seguir.

2.9.1

Mdulo Mod_Python
Existem trs formas de se executar um cdigo Python atravs do Apache. A primeira

atravs do modelo CGI, sigla para o termo Commom Gateway Interface, onde cada requisio
inicializa um processo do interpretador Python e redireciona a sua sada padro para o navegador do usurio. A segunda atravs do redirecionamento da requisio para um outro servidor
Web, que executado em paralelo ao Apache. A terceira e melhor forma de executar um cdigo
Python atravs do Apache utilizando o mdulo mod_python (TRUBETSKOY, 2003).
O mod_python um mdulo para o servidor Web Apache que permite a comunicao do
Apache com o interpretador da linguagem Python. Quando o Apache iniciado, uma instncia
do interpretador Python alocado na memria do servidor, fazendo com que a cada execuo
de um cdigo Python no seja necessrio inicializar o interpretador. Este modelo faz com que
seja aproveitada a habilidade do Apache em tratar as requisies, deixando para o interpretador
Python somente a execuo do cdigo necessrio.
Testes de desempenho constataram a vantagem da utilizao do mod_python com relao ao modelo CGI. A figura 11 mostra os resultados de 1000 execues de um programa
atravs do modelo CGI, utilizando 10 conexes:

(mean time, across all concurrent requests)


Time per request:

77.723 [ms]

Figura 11: Resultados da execuo atravs do modelo CGI


Fonte: (DRAKE, 2005)

31

A figura 12 mostra os resultados de 1000 execues de um programa equivalente ao


executado nos testes com CGI, porm em um ambiente com o mdulo mod_python, utilizando
10 conexes:

(mean time, across all concurrent requests)


Time per request:

5.808 [ms]

Figura 12: Resultados da execuo atravs do mdulo mod_python


Fonte: (DRAKE, 2005)

A figura 13 apresenta um grfico comparativo do desempenho na execuo das requisies utilizando CGI e mod_python.

Figura 13: Comparao de desempenho entre CGI e mod_python

Atravs desta comparao, fica evidente a vantagem de se utilizar o mdulo mod_python


para a execuo de programas Python junto ao servidor Web Apache.

2.10

RELACIONAMENTO ENTRE AS TECNOLOGIAS UTILIZADAS PELO DJANGO

Todas as tecnologias vistas neste captulo so importantes para entender o funcionamento de uma aplicao Web desenvolvida com o framework Django. A figura 14 mostra como

32

essas tecnologias relacionam-se durante a execuo de uma aplicao Web desenvolvida com
Django.

Figura 14: Tecnologias utilizadas por uma aplicao Web desenvolvida com Django

Os usurios, com a utilizao dos navegadores, disparam requisies na Internet que


so tratadas pelo servidor Web. O servidor Web Apache verifica se a requisio necessita
de processamento Python e utiliza o mdulo mod_python. O mdulo faz a comunicao com
o Python, que utiliza os mdulos do Django para realizar o processamento. Caso haja a necessidade de comunicao com o SGBD, o Python utiliza o mdulo MySQLdb para realizar
a comunicao com o SGBD MySQL. Aps processada, a requisio devolvida ao servidor
Apache, que encaminha a resposta aos usurios.
Vale lembrar que as tecnologias utilizadas neste trabalho foram escolhidas de modo
a facilitar o ensino do framework Django. Segundo (HOLOVATY; MOSS, 2006), a utilizao do
servidor Web Apache juntamente com o mdulo mod_python atualmente a configurao mais
robusta para utilizar o Django em um servidor de produo. A escolha do sistema gerenciador
de banco de dados MySQL foi motivada pela sua reputao como banco de dados de aplicaes
Web que exigem grande nmero de conexes e velocidade no acesso aos dados, alm da
grande quantidade de material disponvel para consulta na Internet sobre a sua utilizao.
Porm, caso haja a necessidade, possvel utilizar outras tecnologias, como por exemplo o PostgreSQL como sistema gerenciador de banco de dados ou o lighttpd juntamente com
o FastCGI como servidor Web.
O prximo captulo apresentar as caractersticas e principais funcionalidades do framework Django. No decorrer da explicao, sero apresentados exemplos de utilizao de
cada funcionalidade.

33

DJANGO

Este captulo tem por objetivo detalhar as principais caractersticas e funcionalidades


do framework Django. A maior parte deste captulo foi construda de acordo com as informaes contidas na documentao oficial do projeto Django e no Django Book, livro em fase de
desenvolvimento escrito pelos criadores do framework.

3.1

VISO GERAL

O Django um framework de desenvolvimento de aplicaes Web criado por Adrian


Holovaty e Simon Willison, no ano de 2003. Na poca, ambos eram programadores do jornal
The Lawrence Journal-World, da cidade de Lawrence, localizada no estado do Kansas, nos
Estados Unidos da Amrica. Dois anos mais tarde, em julho de 2005, quando o desenvolvedor
Jacob Kaplan-Moss tambm fazia parte da equipe de desenvolvimento do Django, os seus
criadores resolveram liberar o framework para a comunidade open-source.
O Django foi desenvolvido com o objetivo de facilitar o desenvolvimento de web sites
dinmicos, para que fosse possvel desenvolver pginas com a qualidade e a velocidade exigidas em uma empresa de jornalismo. O objetivo do desenvolvimento foi resolver problemas
encontrados no dia-a-dia dos desenvolvedores do jornal The Lawrence Journal-World.
Atualmente, vrios sites desenvolvidos com o framework Django esto em funcionamento na Internet. O jornal Washington Post, por exemplo, desenvolveu vrios sites para assuntos especficos utilizando o Django. Uma lista de sites e aplicaes desenvolvidos com o
framework Django pode ser visualizada em (DJANGO SOURCE CODE, 2007).

3.2

CARACTERSTICAS

O framework Django possui uma srie de caractersticas que o destacam no que diz
respeito ao desenvolvimento de aplicaes Web:

I. aplicaes desenvolvidas com o Django seguem a arquitetura MVC;


II. automatizao de algumas tarefas do processo de desenvolvimento;
III. reduo do tempo necessrio para a construo da aplicao;

34

IV. mantm o desenvolvedor com o foco nas particularidades do negcio da aplicao;


V. possui uma forma de mapear as URLs requisitadas para os programas que tratam as
requisies;
VI. uma ferramenta de cdigo aberto;
VII. possui comunicao com vrios SGBDs.

3.3

INSTALAO DO FRAMEWORK DJANGO

A instalao do framework Django simples e rpida. O nico requisito que o sistema


onde o Django ser instalado possua a linguagem Python na verso 2.3 ou superior.
Para instalar o Django, necessrio baixar o arquivo de instalao, que pode ser encontrado no site oficial do projeto, disponvel em (LAWRENCE JOURNAL-WORLD, 2007). Aps baixar
o arquivo e descompact-lo, basta executar o script de instalao setup.py, com a opo install,
conforme o exemplo a seguir:

python setup.py install

Figura 15: Execuo do script de instalao do Django

A instalao cria o diretrio Django abaixo do diretrio site-packages, localizado no diretrio de instalao do Python, que pode variar de acordo com o sistema operacional utilizado.
A referncia oficial para a instalao do framework Django pode ser encontrada em
(LAWRENCE JOURNAL-WORLD, 2007).

3.4

DESENVOLVIMENTO DE UMA APLICAO WEB

Para iniciar o desenvolvimento de uma aplicao web com o framework Django, necessrio criar um projeto utilizando o script django-admin.py com a opo startproject e o nome
do projeto, conforme exemplo abaixo:

35

django-admin.py startproject piramide

Figura 16: Criao de um projeto com o script django-admin.py

Este script cria o diretrio do projeto, chamado de piramide, abaixo do diretrio atual.
Caso isto no ocorra, necessrio verificar a instalao do framework Django.
Dentro do diretrio do projeto, so criados os seguintes arquivos:

I. __init__.py: arquivo utilizado pelo Python para identificar que o diretrio atual um pacote;
II. manage.py: arquivo utilizado para a execuo das tarefas do projeto, como uma nova
aplicao ou a sincronizao do projeto com o banco de dados, por exemplo;
III. settings.py: arquivo com as configuraes do projeto;
IV. urls.py: arquivo responsvel pelo mapeamento entre a url solicitada pelo usurio e a view
do projeto responsvel por enviar a resposta requisio.

O Django vem com um servidor Web embutido, bastante til para o processo de aprendizado e de desenvolvimento das aplicaes. Porm, esse servidor no deve ser utilizado em
ambientes de produo, visto que este capaz de atender apenas uma requisio por vez.
Para ambientes de produo, necessrio utilizar um servidor Web capaz de atender mltiplas
requisies, como por exemplo o Apache.
Aps a criao do projeto, possvel executar o servidor Web de desenvolvimento do
Django, atravs do seguinte comando:

python manage.py runserver

Figura 17: Execuo do servidor Web do framework Django

O servidor Web de desenvolvimento do Django atende as requisies na porta 8000.


Caso seja necessrio alterar a porta, basta informar o nmero da porta desejada no comando
de inicializao do servidor, logo aps a opo runserver.

36

Para verificar se o Django est funcionando corretamente, necessrio acessar o endereo http://localhost:8000, onde 8000 o nmero da porta que o servidor responde s requisies. Ao acessar este endereo, a seguinte pgina dever ser apresentada, informando que
o Django est funcionando corretamente:

Figura 18: Acesso ao servidor de desenvolvimento do Django

O framework Django utiliza um conceito de projeto com vrias aplicaes. Quando


falamos de uma aplicao Web, podemos visualizar esta aplicao como sendo um projeto
no Django. J as aplicaes de um projeto possuem um escopo especfico, de forma que
podem ser reutilizadas por vrios projetos. Por exemplo, no projeto piramide ser necessrio
desenvolver o cadastro dos professores. Este cadastro poderia ser utilizado em vrios outros
projetos, de acordo com a necessidade do desenvolvedor. Portanto, ser criada uma aplicao
chamada Professores, dentro do projeto piramide.
Para criar uma aplicao, utiliza-se o script manage.py, conforme o exemplo seguir:

python manage.py startapp professores

Figura 19: Criao da aplicao Professores com o script manage.py

Este script cria o diretrio da aplicao Professores, dentro do projeto piramide. Neste
diretrio, so criados os seguintes arquivos:
I. __init__.py: arquivo utilizado pelo Python para identificar que o diretrio atual um pacote;
II. models.py: arquivo utilizado para a definio dos modelos de dados utilizados pela aplicao;
III. views.py: arquivo utilizado para a definio das views da aplicao, que possuiro o papel
de controller, em uma anlise segundo a metodologia MVC;

37

A definio dos modelos de dados e a utilizao das views sero detalhados mais adiante neste captulo.
A criao do projeto e das suas aplicaes faz com que a estrutura bsica de uma
aplicao Web seja criada. A partir deste momento, necessrio configurar o projeto para,
ento, iniciar a codificao das aplicaes.

3.5

CONFIGURAES DO PROJETO

As configuraes de um projeto desenvolvido com o framework Django encontram-se


no arquivo settings.py, localizado no diretrio raiz do projeto. Alm deste arquivo, o framework
Django possui um arquivo global de configuraes, que inicializa todas as configuraes com os
valores padro. Este arquivo o global_settings.py e fica armazenado no diretrio de instalao
do Django, dentro da pasta conf.
Para carregar as configuraes de um projeto, o Django realiza as seguintes operaes:
I. carrega os valores padro de todas as configuraes informadas no arquivo global_settings.py;
II. substitui as configuraes informadas no arquivo settings.py, com os valores especficos
para a configurao do projeto;
Para que seja possvel utilizar o sistema gerenciador de banco de dados MySQL no
projeto, necessrio alterar as seguintes configuraes no arquivo settings.py:
I. DATABASE_ENGINE: varivel utilizada para informar o sistema gerenciador de banco de
dados utilizado pelo projeto. Os valores possveis so: postgresql_psycopg2, postgresql,
mysql, mysql_old, sqlite3 ou ado_mssql;
II. DATABASE_NAME: varivel utilizada para informar o nome do banco de dados utilizado
pelo projeto;
III. DATABASE_USER: varivel utilizada para informar o nome do usurio que possui acesso
ao banco de dados informado no SGBD;
IV. DATABASE_PASSWORD: varivel utilizada para informar a senha do usurio;
V. DATABASE_HOST: varivel utilizada para informar o servidor onde o SGBD executado.
Caso nenhum valor seja informado, o Django entender que o banco de dados est sendo
executado no mesmo host, e assumir o valor localhost;

38

VI. DATABASE_PORT: varivel utilizada para informar a porta para a conexo com o servidor
do banco de dados;
Alm de configurar os parmetros relacionados ao banco da dados, existem outras configuraes importantes para iniciar o desenvolvimento de uma aplicao Web:

I. TIME_ZONE: varivel utilizada para informar ao Django qual o fuso horrio utilizado pelo
projeto. Uma lista com todas as opes possveis pode ser acessada em (POSTGRESQL
GLOBAL DEVELOPMENT GROUP, 2007).

Este recurso possibilita que um servidor possa hos-

pedar vrias aplicaes Web desenvolvidas com o Django que possuam fusos diferentes.
De acordo com a documentao oficial do projeto, este recurso no est disponvel em
servidores que utilizam o sistema operacional Windows. Nestes casos, esta varivel deve
receber o fuso horrio utilizado pelo sistema operacional;
II. LANGUAGE_CODE: varivel utilizada para informar ao Django o idioma utilizado pelo
projeto;
III. INSTALLED_APPS: varivel utilizada para informar ao Django quais as aplicaes do projeto estaro disponveis. As aplicaes disponveis so informadas em um tupla, objeto
da linguagem Python semelhante a uma lista, porm com a diferena de que ela no pode
ser alterada aps a sua definio, ou seja, imutvel.

A configurao inicial do Django para o projeto utilizado nos exemplos deste trabalho
mostrada na figura 20. As variveis que no so exibidas devem permanecer com os seus
valores iniciais.

39

DATABASE_ENGINE = mysql
DATABASE_NAME = piramide
DATABASE_USER = django
DATABASE_PASSWORD =
DATABASE_HOST =
DATABASE_PORT =

TIME_ZONE = America/Sao_Paulo

LANGUAGE_CODE = pt-br

INSTALLED_APPS = (

django.contrib.auth ,
django.contrib.contenttypes ,
django.contrib.sessions ,
django.contrib.sites ,
piramide.professores
)

Figura 20: Configuraes alteradas para o projeto piramide no arquivo settings.py

importante lembrar que o arquivo settings.py um programa Python e deve estar de


acordo com a sintaxe da linguagem.
O framework Django oferece vrias outras opes de configurao para o projeto, porm
com estas opes devidamente preenchidas possvel iniciar o desenvolvimento da aplicao.
Outras opes de configurao sero vistas no decorrer deste trabalho.

3.6

DEFINIO DOS MODELOS DE DADOS

O prximo passo para o desenvolvimento de uma aplicao que utilize um banco de


dados utilizando o framework Django a definio dos modelos de dados.
Os modelos de dados definem as tabelas e as regras de negcio utilizadas pela aplicao. Utilizando o framework Django, a criao das tabelas feita de modo transparente, de
acordo com as classes definidas pelo desenvolvedor no arquivo models.py, localizado abaixo do
diretrio da aplicao.

40

A figura 21 mostra a definio do modelo de dados Professor para a aplicao professores, no arquivo models.py:

from django . db import models

class P r o f e s s o r ( models . Model ) :

matricula

= models . C h a r F i e l d ( maxlength =50 , b l a n k =False , n u l l = False )

nome

= models . C h a r F i e l d ( maxlength =100 , b l a n k =False , n u l l = False )

endereco

= models . C h a r F i e l d ( maxlength =100 , b l a n k =True , n u l l =True )

bairro

= models . C h a r F i e l d ( maxlength =50 , b l a n k =True , n u l l =True )

cidade

= models . C h a r F i e l d ( maxlength =50 , b l a n k =False , n u l l = False )

uf

= models . C h a r F i e l d ( maxlength =2 , b l a n k =False , n u l l = False )

10

telefone

= models . C h a r F i e l d ( maxlength =20 , b l a n k =False , n u l l = False )

11

email

= models . E m a i l F i e l d ( b l a n k =False , n u l l = False )

12

salario

= models . D e c i m a l F i e l d ( m a x _ d i g i t s =10 , d e c i m a l _ p l a c e s =2)

13

h o r a s _ c o n t r a t o = models . I n t e g e r F i e l d ( b l a n k =False , n u l l = False )

Figura 21: Definio do modelo de dados Professor no arquivo models.py

O Django possui uma srie de tipos de campos que atendem diversas necessidades
encontradas no desenvolvimento de aplicaes Web. A tabela 1, mostrada a seguir, explica os
tipos de campos utilizados no modelo de dados Professor. Uma lista com todos os tipos de
campos disponveis no Django pode ser encontrada em (LAWRENCE JOURNAL-WORLD, 2007).
Tabela 1: Tipos de campo utilizados no modelo de dados Professor
Tipo de Campo

Aplicao

CharField

Utilizado para armazenar valores alfanumricos

EmailField

Utilizado para validar e armazenar endereos de e-mail

DecimalField

Utilizado para armazenar valores numricos com casas decimais

IntegerField

Utilizado para armazenar valores numricos inteiros

Para verificar se a definio do modelo de dados est correta, necessrio utilizar o


script manage.py, que se encontra no diretrio raiz do projeto, com a opo validate, conforme
o exemplo mostrado na figura 22:

41

python manage.py validate

Figura 22: Verificao dos modelos de dados com o script manage.py

Caso a definio do modelo de dados esteja correta, exibida a mensagem 0 errors


found. Em caso de erros, a mensagem exibir qual aplicao est com problemas, qual o erro
encontrado e em que linha do arquivo models.py o erro se encontra.
Com a definio correta dos modelos, o framework Django ir criar as tabelas necessrias no banco de dados configurado no projeto. Para verificar quais comandos SQL o Django ir
executar para criar as tabelas da aplicao, deve-se executar o script manage.py com a opo
sqlall e o nome da aplicao, conforme o exemplo mostrado na figura a seguir:

python manage.py sqlall professores

Figura 23: Verificao dos comandos SQL gerados com base nos modelos de dados

O resultado deste comando, com base no modelo definido no arquivo models.py, deve
ser semelhante ao resultado mostrado na figura 24, quando o SGBD utilizado for o MySQL:

42

BEGIN ;

CREATE TABLE p r o f e s s o r e s _ p r o f e s s o r (

i d i n t e g e r AUTO_INCREMENT NOT NULL PRIMARY KEY,

m a t r i c u l a varchar ( 5 0 ) NOT NULL,

nome varchar ( 1 0 0 ) NOT NULL,

endereco varchar ( 1 0 0 ) NULL,

b a i r r o varchar ( 5 0 ) NULL,

cidade varchar ( 5 0 ) NOT NULL,

uf varchar ( 2 ) NOT NULL,

10

t e l e f o n e varchar ( 2 0 ) NOT NULL,

11

email varchar ( 7 5 ) NOT NULL,

12

s a l a r i o numeric ( 1 0 , 2 ) NOT NULL,

13

h o r a s _ c o n t r a t o i n t e g e r NOT NULL

14

);

15

COMMIT;

Figura 24: Resultado da execuo do script manage.py com a opo sqlall

A execuo do script manage.py com as opes validate e sqlall servem apenas para
realizar verificaes, no sendo necessrio execut-los para criar as tabelas. Porm, caso
exista algum problema na definio dos modelos de dados ou nos parmetros de conexo com
o banco de dados, ser possvel identific-lo antes da execuo do comando para a criao das
tabelas.
Para efetivar a criao das tabelas no banco de dados, necessrio executar o script
manage.py com a opo syncdb, conforme exemplo a seguir:

python manage.py syncdb

Figura 25: Criao das tabelas no banco de dados de acordo com os modelos de dados

Na aplicao Professores existe a necessidade de informar a titulao do professor, que


pode variar de acordo com a instituio que utilizar a aplicao. Para isso, ser criado o modelo
Titulao e relacionado com o modelo Professor, conforme mostrado na figura 26.

43

from django . db import models

class T i t u l a c a o ( models . Model ) :

d e s c r i c a o = models . C h a r F i e l d ( maxlength =50 , b l a n k =False , n u l l = False )

pontos

def _ _ s t r _ _ ( s e l f ) :

8
10

= models . I n t e g e r F i e l d ( b l a n k =False , n u l l = False )

return s e l f . descricao

class P r o f e s s o r ( models . Model ) :

11

matricula

= models . C h a r F i e l d ( maxlength =50 , b l a n k =False , n u l l = False )

12

nome

= models . C h a r F i e l d ( maxlength =100 , b l a n k =False , n u l l = False )

13

endereco

= models . C h a r F i e l d ( maxlength =100 , b l a n k =True , n u l l =True )

14

bairro

= models . C h a r F i e l d ( maxlength =50 , b l a n k =True , n u l l =True )

15

cidade

= models . C h a r F i e l d ( maxlength =50 , b l a n k =False , n u l l = False )

16

uf

= models . C h a r F i e l d ( maxlength =2 , b l a n k =False , n u l l = False )

17

telefone

= models . C h a r F i e l d ( maxlength =20 , b l a n k =False , n u l l = False )

18

email

= models . E m a i l F i e l d ( b l a n k =False , n u l l = False )

19

salario

= models . D e c i m a l F i e l d ( m a x _ d i g i t s =10 , d e c i m a l _ p l a c e s =2)

20

h o r a s _ c o n t r a t o = models . I n t e g e r F i e l d ( b l a n k =False , n u l l = False )

21

titulacao

= models . ForeignKey ( T i t u l a c a o , b l a n k =False , n u l l = False )

Figura 26: Definio do modelo Titulao e relacionamento com o modelo Professor

Os relacionamentos entre os modelos no Django podem ser feitos com os mtodos


descritos na tabela 2.
Tabela 2: Tipos de relacionamento disponveis no framework Django
Mtodo

Tipo de Relacionamento

ForeignKey

Utilizado para relacionamentos com chave estrangeira, ou seja, 1 para n

ManyToManyField

Utilizado para relacionamentos n para n

OneToOneField

Utilizado para relacionamentos 1 para 1

Todos os mtodos de relacionamento devem receber como parmetro o nome do modelo, ou seja, da classe com o qual est sendo feito o relacionamento. Caso o Django no
reconhea o modelo pelo fato de este estar definido aps o modelo que possui o campo relacionado, possvel informar o nome do modelo no formato string como parmetro para o mtodo
de relacionamento, conforme o exemplo mostrado na figura 27.

44

from django . db import models

class P r o f e s s o r ( models . Model ) :

matricula

= models . C h a r F i e l d ( maxlength =50 , b l a n k =False , n u l l = False )

nome

= models . C h a r F i e l d ( maxlength =100 , b l a n k =False , n u l l = False )

endereco

= models . C h a r F i e l d ( maxlength =100 , b l a n k =True , n u l l =True )

bairro

= models . C h a r F i e l d ( maxlength =50 , b l a n k =True , n u l l =True )

cidade

= models . C h a r F i e l d ( maxlength =50 , b l a n k =False , n u l l = False )

uf

= models . C h a r F i e l d ( maxlength =2 , b l a n k =False , n u l l = False )

10

telefone

= models . C h a r F i e l d ( maxlength =20 , b l a n k =False , n u l l = False )

11

email

= models . E m a i l F i e l d ( b l a n k =False , n u l l = False )

12

salario

= models . D e c i m a l F i e l d ( m a x _ d i g i t s =10 , d e c i m a l _ p l a c e s =2)

13

h o r a s _ c o n t r a t o = models . I n t e g e r F i e l d ( b l a n k =False , n u l l = False )

14

titulacao

16

= models . ForeignKey ( Titulacao , b l a n k =False , n u l l = False )

class T i t u l a c a o ( models . Model ) :

17

d e s c r i c a o = models . C h a r F i e l d ( maxlength =50 , b l a n k =False , n u l l = False )

18

pontos

20

def _ _ s t r _ _ ( s e l f ) :

21

= models . I n t e g e r F i e l d ( b l a n k =False , n u l l = False )

return s e l f . descricao

Figura 27: Relacionamento utilizando parmetro string

O mtodo __str__() utilizado para retornar a representao string dos objetos que so
instncias da classe onde o mtodo foi definido. O uso deste mtodo ficar mais claro ao longo
deste captulo. Aps cada alterao no arquivo models.py, necessrio aplicar estas alteraes
no banco de dados, atravs do script manage.py, com a opo syncdb.

3.7

ACESSO AOS DADOS

Aps a criao do modelo de dados, o framework Django disponibiliza uma camada de


abstrao entre a aplicao que est sendo desenvolvida e o sistema gerenciador de banco de
dados, possibilitando ao desenvolvedor criar, consultar, atualizar e excluir registros no banco de
dados sem a necessidade de escrever cdigos na linguagem SQL. Esta funcionalidade faz com
que a aplicao seja independente da tecnologia utilizada pelo SGBD. Caso haja a necessidade
de migrar a aplicao para outro SGBD, esta migrao poder ser feita sem causar impacto na
aplicao.

45

3.7.1

Criao e Atualizao de Registros


Atravs da utilizao dos modelos de dados do framework Django, uma classe Python

do modelo de dados representa uma tabela do banco de dados. Logo, uma instncia desta
classe representa um registro no banco de dados.
Para exemplificar a criao de registros, ser utilizado o console interativo da linguagem
Python no projeto Django. Para iniciar o console interativo do projeto, necessrio executar o
script manage.py com a opo shell, conforme exemplo seguir:

python manage.py shell

Figura 28: Inicializao do console interativo do Projeto

Para criar um registro no banco de dados atravs do Django, basta criar uma instncia
da classe que corresponde a tabela em que deseja-se criar o registro, atribuir os valores necessrios aos atributos do objeto e chamar o mtodo save(). Os atributos do objeto so os campos
definidos no modelo de dados. A figura 29 mostra um exemplo de criao de um registro atravs do console interativo do projeto. importante lembrar que para cada modelo de dados, o
Django cria um campo chamado id, que recebe um valor seqencial automaticamente durante
a criao do registro. O exemplo mostra que este campo no possui valor antes da chamada do
mtodo save(). Aps a chamada do mtodo, o registro j est armazenado no banco de dados
e o campo id possui o valor 1.

>>> from piramide.professores.models import Titulacao


>>> t = Titulacao(descricao=Graduado, pontos=1)
>>> print t.id
None
>>> t.save()
>>> print t.id
1
>>>

Figura 29: Criao de um registro na tabela Titulao

46

A alterao de registros possui um funcionamento semelhante a criao de registros. A


diferena est na definio de um valor para o campo da chave primria da tabela. Na execuo
do mtodo save(), o Django verifica se o campo da chave primria est preenchido com algum
valor e, caso esteja, faz uma consulta no banco de dados de acordo com o valor informado. Se
encontrar um registro, este atualizado. Caso no encontre, o Django cria o registro com os
valores informados.

>>> from piramide.professores.models import Titulacao


>>> t = Titulacao(id=1, descricao=Mestrado, pontos=1)
>>> t.save()
>>> t.descricao = Graduado
>>> t.save()
>>>

Figura 30: Alterao de um registro na tabela Titulao

Desta forma, a consulta no banco de dados realizada pelo Django acontece somente na
chamada do mtodo save(), sendo assim necessrio informar os valores para todos os campos
do registro, mesmo que a necessidade seja alterar apenas um. Para contornar este problema,
possvel realizar a busca do registro, alterar somente o campo necessrio e salvar a atualizao. Para buscar o registro em questo, utiliza-se o mtodo get(), passando como parmetro
o campo, a condio e o valor para consulta. Qualquer campo do modelo de dados pode ser
utilizado, juntamente com as condies de consulta que sero vistas ao longo deste captulo.

47

>>> from piramide.professores.models import Titulacao


>>> t = Titulacao.objects.get(id=1)
>>> print t.descricao
Graduado
>>> t.descricao = Mestrado
>>> t.save()
>>> print t.descricao
Mestrado
>>> t.descricao = Graduado
>>> t.save()
>>>

Figura 31: Alterao de um registro utilizando o mtodo get()

3.7.2

Consulta ao Banco de Dados


Conforme visto na figura 31, com a utilizao do mtodo get() possvel consultar um

registro especfico no banco de dados. Porm, durante o desenvolvimento de uma aplicao,


existe a necessidade de consultar todos os registros de uma tabela, ou consultar todos os
registros que satisfaam uma ou mais condies.
A busca dos registros no banco de dados feito atravs de um gerenciador do modelo
de dados. Todo modelo de dados possui no mnimo um gerenciador, chamado de objects.
Este objeto uma instncia da classe django.db.models.manager.Manager e utilizado para
buscar um QuerySet, que representa uma coleo de vrios objetos do banco de dados. O
QuerySet, por sua vez, pode possuir filtros que iro limitar a busca dos registros de acordo com
as condies especificadas. Em uma analogia com a linguagem SQL, o QuerySet representa o
comando SELECT e os filtros representam as clusulas WHERE.
A consulta a todos os registros de uma tabela pode ser feita utilizando o mtodo all(),
conforme exemplo a seguir:

48

>>> from piramide.professores.models import Titulacao


>>> t = Titulacao.objects.all()
>>> for item in t:
...

print item.descricao

...
Graduado
Mestrado
Doutorado
>>>

Figura 32: Consulta a todos os registros da tabela Titulacao com o mtodo all()

Para que o resultado de uma consulta seja ordenado pelos valores de um campo especfico, utiliza-se o mtodo order_by().

>>> from piramide.professores.models import Titulacao


>>> t = Titulacao.objects.all().order_by(descricao)
>>> for item in t:
...

print item.descricao

...
Doutorado
Graduado
Mestrado
>>>

Figura 33: Ordenao dos registros de uma consulta com o mtodo order_by()

Durante o desenvolvimento de uma aplicao, comum que o desenvolvedor necessite


adicionar condies na consulta, para obter uma coleo de registros mais especfica. O Django
oferece dois mtodos para adicionar estas condies ao QuerySet:

I. filter(): retorna um novo QuerySet com os registros que atendem as condies informadas
nos parmetros do mtodo;

49

II. exclude(): retorna um novo QuerySet com os registros que no atendem as condies
informadas nos parmetros do mtodo.

A figura 34 mostra exemplos da utilizao dos mtodos filter() e exclude().

>>> from piramide.professores.models import Titulacao


>>> t = Titulacao.objects.filter(descricao=Graduado)
>>> for item in t:
...

print item.descricao

...
Graduado
>>> t = Titulacao.objects.exclude(descricao=Graduado)
>>> for item in t:
...

print item.descricao

...
Mestrado
Doutorado
>>>

Figura 34: Consulta condicional aos registros da tabela Titulacao

Os parmetros utilizados nos mtodos filter(), exclude() e get() so informados seguindo


a estrutura campo__condio = valor. A figura 35 mostra um exemplo da utilizao da condio
gte para filtrar a consulta aos registros da tabela Titulacao:

>>> from piramide.professores.models import Titulacao


>>> t = Titulacao.objects.filter(pontos__gte=5)
>>> for item in t:
...

print item.descricao

...
Mestrado
Doutorado

Figura 35: Utilizao da condio gte na consulta aos registros da tabela Titulacao

50

As condies utilizadas nos parmetros dos mtodos de consulta so chamadas de


field lookups. A tabela 3 lista as condies de consulta aos dados disponveis no Django e o
resultado da sua utilizao.
Tabela 3: Condies de consulta aos dados
Condio

Resultado

exact

Valor do campo utilizado na condio exatamente igual ao informado

iexact

Possui a mesma funcionalidade do exact, porm desconsidera diferenas entre


maisculas e minsculas

contains

Contedo do campo utilizado na condio possui o valor informado

icontains

Possui a mesma funcionalidade do contains, porm desconsidera diferenas


entre maisculas e minsculas

gt

Valor do campo utilizado na condio maior que o valor informado

gte

Valor do campo utilizado na condio maior ou igual ao valor informado

lt

Valor do campo utilizado na condio menor que o valor informado

lte

Valor do campo utilizado na condio menor ou igual ao valor informado

in

Valor do campo utilizado na condio seja igual a um dos tens de uma lista

startswith

Valor do campo utilizado na condio inicie com o valor informado

istartswith

Possui a mesma funcionalidade do startswith, porm desconsidera diferenas


entre maisculas e minsculas

endswith

Valor do campo utilizado na condio termine com o valor informado

iendswith

Possui a mesma funcionalidade do endswith, porm desconsidera diferenas


entre maisculas e minsculas

range

Valor do campo utilizado na condio esteja entre a faixa de valores informada


(inclusive)

year

Para campos do tipo date e datetime, o ano seja igual ao valor informado,
utilizando quatro dgitos

month

Para campos do tipo date e datetime, o ms seja igual ao valor informado,


utilizando nmeros de 1 (Janeiro) 12 (Dezembro)

day

Para campos do tipo date e datetime, o dia seja igual ao valor informado

isnull

Valores nulos no campo utilizado na condio sejam considerados na consulta,


informando True ou False

search

Utilizado para busca por contedo apenas no SGBD MySQL, pelo fato de utilizar a indexao do texto disponvel pelo SGBD, desde que este tenha sido
configurado

As condies de consulta que consideram diferenas entre maisculas e minsculas


no funcionam no SGBD SQLite. A utilizao destas condies ir desconsiderar a diferena
entre maisculas e minsculas para obter o resultado da consulta neste SGBD.
O framework Django oferece outras opes para realizar uma consulta aos dados. As
condies apresentadas neste trabalho so suficientes para atender a maioria das necessida-

51

des existentes no desenvolvimento de uma aplicao. Porm, existem casos especficos em


que o desenvolvedor necessita realizar a consulta com condies mais complexas. A explicao de todas as condies de consulta oferecidas pelo Django est disponvel na documentao
oficial do framework, no endereo (LAWRENCE JOURNAL-WORLD, 2007).

3.7.3

Excluso de Registros
A excluso de registros atravs do framework Django efetuada pelo mtodo delete().

Este mtodo pode ser chamado de um objeto relacionado um registro no banco de dados ou
de um QuerySet. A execuo do mtodo delete() a partir de um QuerySet ir excluir todos os
registros retornados pelo QuerySet.
A excluso de um registro utilizado como chave estrangeira em outros registros far com
que os registros que utilizam esta chave sejam excludos junto com o registro em questo. Este
mecanismo do Django comporta-se da mesma forma que o DELETE CASCADE da linguagem
SQL.

3.8

INTERFACE DE ADMINISTRAO

Algumas aplicaes Web possuem como principal objetivo apresentar determinado contedo aos usurios, como os blogs, os portais de notcias, entre outros. Porm, o contedo
destas aplicaes precisa ser manutenido por algum usurio, atravs de uma interface que
possibilite a manuteno deste contedo. Geralmente, estas interfaces so muito parecidas
em todas as aplicaes Web, e possibilitam ao usurio criar, consultar, alterar e excluir dados
utilizados pela aplicao.
Com o objetivo de facilitar o desenvolvimento destas interfaces de manuteno de contedo, o framework Django oferece uma interface de administrao, criada automaticamente de
acordo com os modelos de dados, possibilitando aos usurios criar, alterar, consultar e excluir
dados das tabelas includas nesta interface.
Para utilizar a interface de administrao do Django, o desenvolvedor deve primeiramente identificar quais modelos de dados sero utilizados na interface de administrao, adicionando a declarao da classe Admin dentro da classe que corresponde ao modelo de dados,
no arquivo models.py, conforme o exemplo a seguir:

52

from django . db import models

class T i t u l a c a o ( models . Model ) :

d e s c r i c a o = models . C h a r F i e l d ( maxlength =50 , b l a n k =False , n u l l = False )

pontos

def _ _ s t r _ _ ( s e l f ) :

= models . I n t e g e r F i e l d ( b l a n k =False , n u l l = False )

return s e l f . descricao

class Admin :

pass

11

class P r o f e s s o r ( models . Model ) :

12

matricula

= models . C h a r F i e l d ( maxlength =50 , b l a n k =False , n u l l = False )

13

nome

= models . C h a r F i e l d ( maxlength =100 , b l a n k =False , n u l l = False )

14

endereco

= models . C h a r F i e l d ( maxlength =100 , b l a n k =True , n u l l =True )

15

bairro

= models . C h a r F i e l d ( maxlength =50 , b l a n k =True , n u l l =True )

16

cidade

= models . C h a r F i e l d ( maxlength =50 , b l a n k =False , n u l l = False )

17

uf

= models . C h a r F i e l d ( maxlength =2 , b l a n k =False , n u l l = False )

18

telefone

= models . C h a r F i e l d ( maxlength =20 , b l a n k =False , n u l l = False )

19

email

= models . E m a i l F i e l d ( b l a n k =False , n u l l = False )

20

salario

= models . D e c i m a l F i e l d ( m a x _ d i g i t s =10 , d e c i m a l _ p l a c e s =2)

21

h o r a s _ c o n t r a t o = models . I n t e g e r F i e l d ( b l a n k =False , n u l l = False )

22

titulacao

23

class Admin :

24

pass

= models . ForeignKey ( T i t u l a c a o , b l a n k =False , n u l l = False )

Figura 36: Ativando a interface de administrao nos modelos de dados

Aps configurar os modelos de dados, necessrio alterar a opo INSTALLED_APPS,


para informar que a interface de administrao uma aplicao utilizada pelo projeto, adicionando a aplicao django.contrib.admin. A figura 37 mostra um exemplo da configurao do
projeto para ativar a interface de administrao.

53

INSTALLED_APPS = (

django.contrib.auth ,
django.contrib.contenttypes ,
django.contrib.sessions ,
django.contrib.sites ,
django.contrib.admin ,
piramide.professores
)

Figura 37: Configurao para ativar a interface de administrao

Aps realizar estas alteraes, necessrio executar o script manage.py, com a opo
syncdb, para que o Django crie as tabelas utilizadas pela interface de administrao. Neste momento, o Django criar as tabelas necessrias e solicitar a criao de um usurio administrador
para a interface de administrao.
Antes de acessar a interface de administrao, necessrio alterar o arquivo urls.py,
que se encontra no diretrio do projeto. Para ativar o acesso interface de administrao, basta
remover o comentrio da linha referente a interface de administrao, excluindo o caracter #. O
exemplo a seguir mostra como o arquivo urls.py deve ser configurado para ativar a interface de
administrao. Maiores detalhes sobre a configurao de URLs sero vistas no prximo item
deste trabalho.

from django . c o n f . u r l s . d e f a u l t s import

u r l p a t t e r n s = p a t t e r n s ( ,

# Example :

# ( r ^ piramide / , include ( piramide . foo . u r l s ) ) ,

# Uncomment t h i s f o r admin :

( r ^admin/ , i n c l u d e ( django.contrib.admin.urls ) ) ,

Figura 38: Configurao de URL para ativar a interface de administrao

Para verificar se a interface de administrao est funcionando corretamente, basta iniciar o servidor de desenvolvimento do Django, atravs do script manage.py com a opo run-

54

server e acessar o endereo http://localhost:8000/admin. A pgina de acesso para a interface


de administrao deve ser exibida, conforme mostra a figura 39.

Figura 39: Interface de administrao do Django

Na pgina inicial da interface de administrao, so apresentadas todas as tabelas selecionadas na definio dos modelos de dados. O Django exibe o nome dos modelos de dados no
plural, porm ele faz isso apenas colocando a letra S no final do nome do modelo. Para corrigir
este nome, necessrio declarar a classe Meta dentro de cada modelo de dados, e informar
um valor para o atributo verbose_name_plural, conforme a figura 40.

from django . db import models

class T i t u l a c a o ( models . Model ) :

d e s c r i c a o = models . C h a r F i e l d ( maxlength =50 , b l a n k =False , n u l l = False )

pontos

def _ _ s t r _ _ ( s e l f ) :

= models . I n t e g e r F i e l d ( b l a n k =False , n u l l = False )

return s e l f . descricao

class Admin :

pass

10
11

class Meta :
verbose_name_plural = "Titulaes"

Figura 40: Alterao do nome do modelo de dados Titulacao no plural

Este valor ser reconhecido pelo Django como o nome do modelo de dados no plural.
Com a alterao dos nomes dos modelos de dados, a pgina principal da interface de administrao deve ser semelhante a figura 41.

55

Figura 41: Pgina principal da interface de administrao do Django

Existem alguns atributos da classe Admin que adicionam recursos na listagem dos registros na interface de administrao. O atributo list_display recebe uma tupla com os campos
que sero exibidos na listagem. O atributo list_filter recebe uma tupla com os campos que
podero ser filtrados atravs de uma seleo na interface de administrao. O atributo search_fields recebe uma tupla com os campos que sero utilizados para localizar um registro na
listagem. A figura a seguir mostra a listagem dos registros na interface de administrao com
esses atributos configurados.

Figura 42: Listagem dos registros da tabela Professor

Na insero dos registros, a interface de administrao faz todas as validaes necessrias de acordo com a definio do modelo de dados. Nos campos de chave estrangeira, o
Django oferece um campo para a seleo dos registros da tabela relacionada. Os valores apre-

56

sentados nesta lista so as representaes string dos registros, definidas no mtodo __str__()
do modelo de dados relacionado. A figura 43 mostra as validaes realizadas pela interface de
administrao e o campo Titulacao, com os registros da tabela Titulacao dispostos em uma lista
para seleo.

Figura 43: Validao dos campos na insero de um registro na tabela Professor

A interface de administrao oferecida pelo framework Django um dos grandes atrativos da ferramenta. Com ela possvel manutenir os dados da aplicao utilizando uma interface
agradvel e fcil de usar.

3.9

VIEWS E CONFIGURAO DAS URLS

As views do framework Django fazem o papel de controller da aplicao, de acordo com


o padro MVC. As views so responsveis por receber as requisies e enviar as respostas
aos usurios. Para o Django, uma view um mtodo definido no arquivo views.py, localizado
no diretrio da aplicao, conforme a figura 44:

57

from django . h t t p import HttpResponse

import d a t e t i m e

def d a t a h o r a _ a t u a l ( r e q u e s t ) :

datahora = d a t e t i m e . d a t e t i m e . now ( )

h t m l ="""<html> <body>

<p>Data e hora, conforme o TIME_ZONE definido no settings.py:</p>

<p>%s</p>

</body> </html>""" % datahora

10

r e t u r n HttpResponse ( h t m l )

Figura 44: View definida no arquivo views.py

Aps escrever a view, necessrio configurar a sua chamada, atravs da estruturao


das URLs, uma importante etapa no desenvolvimento da aplicao. Quando uma URL no servidor alterada, nunca possvel avisar a todos que possuem links para a URL antiga sobre a
mudana. Quando algum acessa um endereo e este no existe mais, esta pessoa perde a
confiana nos donos da aplicao e sentem-se frustrados, por no conseguirem acessar o que
desejam (BERNERS-LEE, 1998).
Para estruturar as URLs da aplicao, o Django possui um mdulo chamado URLConf, um acrnimo para configurao de URL. Este mdulo um programa Python onde o
desenvolvedor cria um mapeamento entre padres de URL e as views do projeto. O programa onde os mapeamentos so criados definido nas configuraes do projeto, na varivel ROOT_URLCONF, que por padro vem preenchida com o valor "nomedoprojeto.urls", que
corresponde ao arquivo urls.py localizado no diretrio do projeto.
Os padres de URL so escritos com expresses regulares. As expresses regulares
so pequenas expresses que especificam padres de texto. A tabela 4 apresenta alguns
exemplos de expresses regulares.

58

Tabela 4: Exemplos de expresses regulares


Fonte: (LAWRENCE JOURNAL-WORLD, 2007)
Expresso

Significado

. (ponto)

Qualquer caracter

\d

Qualquer nmero

[A-Z]

Qualquer caracter de A at Z (maisculas)

[a-z]

Qualquer caracter de a at z (minsculas)

[A-Za-z]

Qualquer caracter de a at z (maisculas ou minsculas)

[^/]+

Todos os caracteres at uma barra, sem incluir a barra

Um ou mais do caracter anterior. Por exemplo, \d+ encontrar um ou mais nmeros

{1,3}

Entre um e trs (inclusive), representando quantidade do caracter anterior

Para exemplificar a configurao das URLS, ser definido que todas as requisies realizadas na url /agora/ sero respondidas pela view datahota_atual. A figura 45 mostra como criar
este mapeamento. Aps configurar o mapeamento, o acesso ao endereo http://localhost:8000/agora/
deve apresentar a resposta enviada pela view datahora_atual.

from django . c o n f . u r l s . d e f a u l t s import

from p r o f e s s o r e s . views import d a t a h o r a _ a t u a l

u r l p a t t e r n s = p a t t e r n s ( ,

# Example :

# ( r ^ piramide / , include ( piramide . foo . u r l s ) ) ,

# Uncomment t h i s f o r admin :

( r ^admin/ , i n c l u d e ( django.contrib.admin.urls ) ) ,

10
11

( r ^agora/$ , d a t a h o r a _ a t u a l ) ,
)

Figura 45: Configurao de URL mapeada para a view datahora_atual

O acesso ao endereo http://localhost:8000/agora/ deve apresentar uma resposta semelhante a figura 46.

59

Figura 46: Acesso ao endereo relacionado view datahora_atual

Em diversas situaes do desenvolviemento de uma aplicao Web existe a necessidade da passagem de parmetros pela URL para o programa que trata as requisies. Para
atender essa necessidade em uma aplicao desenvolvida com o framework Django, necessrio alterar a configurao das URLs de modo que estas possam receber parmetros e
alterar a definio das views envolvidas, incluindo o parametro necessrio. A figura 47 mostra
a configurao de uma URL que interpreta os parmetros enviados.

( r ^agora/(?P<parametro>\w+)/$ , d a t a h o r a _ a t u a l ) ,

Figura 47: Passagem de parmetros pela URL

A definio da view deve ser alterada para receber o parmetro. A figura 48 mostra a
definio da view alterada com a incluso de um parmetro, que recebe o valor Nenhum caso
o parmetro no seja passado.

def d a t a h o r a _ a t u a l ( request , parametro="Nenhum" ) :

Figura 48: Parmetros na definio da view datahora_atual

Para situaes em que o desenvolvedor necessita desenvolver uma view para listar os
registros de uma tabela, exibir os detalhes de um registro, agrupar os registros por data ou
simplismente direcionar a URL para um template, o Django oferece uma forma fcil de realizar estas tarefas sem que o desenvolvedor precise escrever uma view para cada situao. As
Views Genricas so implementaes genricas para problemas comuns, como os citados anteriormente. A documentao necessria para o uso das views genricas est disponvel no
endereo (LAWRENCE JOURNAL-WORLD, 2007)

60

3.9.1

AJAX
As requisies AJAX, acrnimo em lngua inglesa para Asynchronous Javascript And

XML, podem ser utilizadas nas aplicaes desenvolvidas com o framework Django. Para tratar
uma requisio AJAX, necessrio definir uma URL e desenvolver uma view, que far todo o
processamento necessrio e enviar a resposta ao solicitante. A figura 49 apresenta uma view
que retorna os dados para o requisitante no formato XML.

from django . h t t p import HttpResponse

def r e q u i s i c a o _ a j a x ( r e q u e s t ) :

r e t o r n o = """<?xml version=" 1 . 0 "?>

<professores>

<professor nome=" Marco Andr Lopes Mendes" />

<professor nome=" Eduardo da S i l v a " />

</professores>

"""

10

r e t u r n HttpResponse ( r e t o r n o , mimetype="text/xml" )

Figura 49: View para retornar dados no formato XML

Uma grande necessidade nas aplicaes que utilizam requisies AJAX a tarefa de
transformar o resultado de uma consulta ao banco de dados para o formato XML. O Django
possui uma API que realiza a converso de um QuerySet para o formato XML, chamada de
serializers. Porm, a documentao oficial do projeto alerta os desenvolvedores de que esta
API est sendo completamente alterada e que seria perigoso utiliz-la at que uma nova verso
esteja disponvel.
Uma alternativa ao uso da API serializers a utilizao dos templates, que sero explicados no prximo item deste trabalho.
O framework Django no possui nenhum facilitador para o envio das requisies AJAX
e para o tratamento da resposta enviada pelo servidor. Estas funcionalidades devem ser implementadas pelo desenvolvedor, utilizando a linguagem JavaScript. Existem vrios scripts de
cdigo aberto disponveis na Internet, que auxiliam o desenvolvedor nestas tarefas. O fato de o
framework Django no utilizar nenhum controle no envio das requisies garante ao desenvolvedor a liberdade de escolha dos scripts que melhor atendam as suas necessidades.

61

3.10

TEMPLATES

No item anterior foi apresentada a utilizao das views, onde o cdigo HTML relacionado interface foi escrito diretamente na view, juntamente com o cdigo Python. Esta prtica
no segue o padro MVC, que recomenda separar o cdigo do controller do cdigo relacionado
interface. Esta recomendao justifica-se pelo fato de as empresas de desenvolvimento de
aplicaes Web possurem pessoas diferentes para codificar as regras de negcio e para desenvolver a interface da aplicao. A separao destas funes torna mais fcil a manuteno
da aplicao.
Para atender esta necessidade, o framework Django oferece um sistema de templates
que possibilita ao desenvolvedor escrever um documento de texto com marcaes especficas
da linguagem de template do Django. Esse documento de texto pode ser o cdigo de um
documento HTML, um arquivo XML ou um texto para o envio de e-mails, por exemplo.
Um template pode conter, alm de texto, blocos e variveis da linguagem de template do
Django. Os blocos, delimitados pelas marcaes {% e %}, so utilizados para processamento
condicional, laos de repetio, exibio de valores no documento ou para habilitar o acesso
a outras marcaes de um template. As variveis, delimitadas pelas marcaes {{ e }}, so
utilizadas para exibir valores no documento.
Os valores so passados para as variveis do template atravs de um mapeamento
entre o nome da varivel e o valor que esta ir receber, realizado por um objeto instanciado da
classe Context, o qual chamado de contexto. Os objetos template renderizam um ou mais
contextos para receber os valores das suas variveis.
A figura 50 exemplifica a utilizao de blocos, variveis e contextos em um template,
utilizado o console interativo do projeto. Para utilizar o console interativo do projeto, basta utilizar
o comando python manage.py shell no diretrio do projeto:

62

>>> from django.template import Template, Context


>>> t = Template("""{% if loginok %}Bem vindo, {{user}}!
... {% else %}{{user}}, efetue o login.
... {% endif %}""")
>>> c = Context({"user": "Fabio", "loginok": True})
>>> c1 = Context({"user": "Thomaz", "loginok": False})
>>> t.render(c)
Bem vindo, Fabio!\n
>>> t.render(c1)
Thomaz, efetue o login.\n
>>>

Figura 50: Utilizao de blocos, variveis e contextos em templates

importante destacar que, para condies em que necessrio comparar dois objetos,
utilizam-se as marcaes {% ifequal objeto1 objeto2 %} e {% ifnotequal objeto1 objeto2 %}, para
igualdade e diferena, respectivamente. Essas marcaes suportam a utilizao da marcao
{% else %} e as marcaes que definem o fim do bloco so {% endifequal %} e {% endifnotequal
%}.
Quando desenvolvidos em arquivos independentes, os templates podem ser armazenados em qualquer diretrio. Porm, este diretrio deve ser informado nas configuraes do
projeto, na opo TEMPLATE_DIRS. Essa opo armazena uma tupla de strings que contm o
diretrio completo onde encontram-se os templates. Quando um programa solicita a utilizao
de um template, o framework Django procura pelo template nos diretrios na ordem em que
estes foram informados na configurao.

TEMPLATE_DIRS = (

/home/django/piramide/templates ,
/home/django/diversos/templates
)

Figura 51: Configurao da opo TEMPLATE_DIRS

63

Para exemplificar a utilizao dos templates em arquivos independentes, a figura 52


mostra o cdigo HTML do arquivo titulacao_list.html, com as marcaes da linguagem de template do Django para listar os registros armazenados na tabela Titulacao.

<html>

<body>

<h1> R e g i s t r o s da t a b e l a T i t u l a o < / h1>

<ul>

{% f o r i t e m i n t i t u l a c o e s %}

< l i > { { item . descricao } } < / l i >

{% e n d f o r %}

< / ul>

< / body>

10

< / html>

Figura 52: Template para listar os registros da tabela Titulacao

Com o template desenvolvido, necessrio desenvolver a view que passar o QuerySet


titulacoes para o template, conforme exemplo a seguir.

from django . t e m p l a t e . l o a d e r import g e t _ t e m p l a t e

from django . t e m p l a t e import Context

from django . h t t p import HttpResponse

from p i r a m i d e . p r o f e s s o r e s . models import T i t u l a c a o

def l i s t a _ t i t u l a c a o ( r e q u e s t ) :

r e g i s t r o s = T i t u l a c a o . o b j e c t s . a l l ( ) . order_by ( pontos )

t = g e t _ t e m p l a t e ( titulacao_list.html )

c = Context ( { "titulacoes" : r e g i s t r o s } )

10

html = t . render ( c )

11

r e t u r n HttpResponse ( h t m l )

Figura 53: View para listar os registros da tabela Titulacao

Para disponibilizar o acesso view desenvolvida, criar o mapeamento entre a URL e


view no arquivo urls.py, conforme a figura 54.

64

from django . c o n f . u r l s . d e f a u l t s import

from p r o f e s s o r e s . views import l i s t a _ t i t u l a c a o

u r l p a t t e r n s = p a t t e r n s ( ,

# Example :

# ( r ^ piramide / , include ( piramide . foo . u r l s ) ) ,

# Uncomment t h i s f o r admin :

( r ^admin/ , i n c l u d e ( django.contrib.admin.urls ) ) ,

10
11

( r ^titulacoes/$ , l i s t a _ t i t u l a c a o ) ,
)

Figura 54: Configurao da URL para a view lista_titulacao

Com todas estas etapas desenvolvidas, necessrio iniciar o servidor de desenvolvimento do Django. O endereo http://localhost:8000/titulacoes/ deve mostrar uma lista com os
registros armazenados no banco de dados, conforme a figura 55.

Figura 55: Lista com os registros da tabela Titulacao

Estes exemplos abordam o funcionamento bsico do sistema de templates do framework


Django. Porm, o sistema de templates possui uma srie de recursos que tornam-o uma poderosa ferramenta para o desenvolvimento da interface das aplicaes desenvolvidas com o
Django. A referncia completa para a utilizao do sistema de templates pode ser encontrada
na documentao oficial do projeto, em duas perspectivas diferentes:

I. Para desenvolvedores Python, no endereo:


http://www.djangoproject.com/documentation/templates_python/;
II. Para Web Designers, no endereo:
http://www.djangoproject.com/documentation/templates/.

65

3.11

MANIPULAO DE FORMULRIOS

O framework Django possui uma biblioteca para manipulao de formulrios HTML chamada newforms. A utilizao dessa biblioteca facilita o desenvolvimento de formulrios e a
validao dos dados pelo servidor, de acordo com os tipos de campo utilizados.
Em aplicaes que utilizam a interface de administrao para manipulao dos dados
e apenas exibem o contedo, como site de notcias, pode existir a necessidade da utilizao
de um formulrio. Um exemplo seria um formulrio para contato, onde o usurio informa o seu
nome, o seu e-mail e a mensagem desejada. Porm, em aplicaes que por algum motivo no
utilizam a interface de administrao, existe a necessidade do desenvolvimento dos formulrios
para cadastro, de acordo com os modelos de dados. O Django oferece a possibilidade de criar
um formulrio independente do modelo de dados, como tambm possibilita ao desenvolvedor
criar um formulrio para o cadastro em um modelo de dados especfico.
A criao de um formulrio independente do modelo de dados necessita da definio da
classe do formulrio, com os atributos representando os campos necessrios. Esta definio
pode ser feita em um arquivo independente, definido pelo desenvolvedor. Para exemplificar a
definio de um formulrio, criado um arquivo no diretrio da aplicao professores, chamado
formularios.py. Este formulrio apenas um exemplo, pois no existe a necessidade de existir
um formulrio de contato na aplicao professores. A figura 56 mostra a definio do formulrio
de contato no arquivo formularios.py.

from django import newforms as forms

class ContatoForm ( forms . Form ) :

nome = forms . C h a r F i e l d ( max_length =100)

e m a i l = forms . E m a i l F i e l d ( )

mensagem = forms . C h a r F i e l d ( )

Figura 56: Definio de um formulrio para contato

Para utilizar este formulrio, necessrio import-lo na view correspondente e pass-lo


ao template. Este fluxo ser apresentado na criao do formulrio para o cadastro de professores.
A criao de um formulrio baseado em um modelo de dados no necessita da definio
do formulrio. O Django cria a definio automaticamente, atravs do mtodo form_for_model().

66

A figura 57 mostra o cdigo da view professor_add, que inicialmente cria o formulrio de acordo
com o modelo de dados Professor e passa para o template professor_form.html.

from django . t e m p l a t e . l o a d e r import g e t _ t e m p l a t e

from django . t e m p l a t e import Context

from django import newforms as forms

from django . h t t p import HttpResponse

from p i r a m i d e . p r o f e s s o r e s . models import

def p ro fe ss o r_ ad d ( r e q u e s t ) :

F o r m u l a r i o = forms . form_for_model ( P r o f e s s o r )

t = g e t _ t e m p l a t e ( professores/professor_form.html )

10

i f r e q u e s t . method == POST :

11

dados = r e q u e s t .POST

12

f = F o r m u l a r i o ( dados )

13

if f . is_valid () :

14

c le a n _d a t a = f . c l e a n _ d a t a

15

c = Context ( { "formulario" : f , "dados" : c l e a n _ d a t a } )

16

html = t . render ( c )

17

r e t u r n HttpResponse ( h t m l )

18
19

else :
f = Formulario ( )

21

c = Context ( { "formulario" : f } )

22

html = t . render ( c )

23

r e t u r n HttpResponse ( h t m l )

Figura 57: Criao do formulrio para cadastro na tabela Professor

Quando o usurio finaliza o cadastro, os dados so enviados para essa mesma view,
atravs do mtodo POST. Quando a view recebe os dados, faz a validao automtica do
formulrio disponvel no Django. Se os dados inseridos estiverem corretos, a view encaminhaos para o template, com o intuito de apresentar os dados informados pelo usurio. Em uma
aplicao Web, ao invs de retornar os dados para o template, neste momento seria confirmada
a incluso do registro na tabela Professor. Caso a validao encontre erros, os dados so
enviados novamente para o formulrio e os erros so apresentados no template. O cdigo do
template apresentado na figura 58.

67

<html>

<head>

< t i t l e > I n c l u s o de P r o f e s s o r e s < / t i t l e >

< / head>

<body>

<h1> I n c l u s o de P r o f e s s o r e s < / h1>

<form i d ="form_professor" action ="/professor/add/" method="POST">

<table>

{ { formulario . as_table } }

10

< / table>

11

<input type="submit">

12

< / form>

13

{% i f dados %}

14

<p> Dados : { { dados } } < / p>

15

{% e n d i f %}

16

< / body>

17

< / html>

Figura 58: Template com o formulrio para cadastro na tabela Professor

Os formulrios podem ser exibidos no template de trs formas diferentes:


I. Com o mtodo as_p(), que retorna os campos do formulrio como pargrafos, utilizando
a marcao <p> da linguagem HTML;
II. Com o mtodo as_ul(), que retorna os campos do formulrio como itens de uma lista,
utilizando a marcao <ul> da linguagem HTML;
III. Com o mtodo as_table(), que retorna os campos do formulrio dispostos em uma tabela.
A documentao oficial do framework Django possui pouca documentao sobre a utilizao da biblioteca newforms. Porm, com os exemplos citados, possvel compreender o
funcionamento bsico deste recurso.

3.12

PUBLICAO NO SERVIDOR WEB APACHE

A execuo das aplicaes desenvolvidas com o framework Django em um ambiente


de produo no deve ser feita utilizando o servidor de desenvolvimento disponvel no Django.
Esse servidor consegue tratar apenas uma requisio por vez.

68

De acordo com (HOLOVATY; MOSS, 2006), a utilizao do servidor Web Apache com o
mdulo mod_python atualmente a configurao mais robusta para ambientes de produo
de aplicaes desenvolvidas com o Django. O Apache nas verses 2.x e o mod_python nas
verses 3.x so requisitos para a utilizao desse servidor com o Django.
Para configurar o Django no Apache, necessrio verificar se o mdulo mod_python
est ativo. A ativao do mdulo feita pelo comando LoadModule, no arquivo de configurao
do Apache. Aps verificar o mdulo, necessrio alterar as configuraes do servidor para
reconhecer a aplicao, conforme a figura 60.

<Location "/">
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE piramide.settings
PythonPath "[/diretorio_do_projeto] + sys.path"
PythonDebug Off
</Location>
<Location "/media/">
SetHandler None
</Location>

Figura 59: Configurao do servidor Apache

A varivel DJANGO_SETTINGS_MODULE deve receber as configuraes do projeto


em questo. No exemplo, foram passadas as configuraes do projeto piramide.
Utilizando essa configurao, a aplicao desenvolvida com o framework Django estar funcionando. Porm, a interface de administrao da aplicao no ser exibida corretamente. Este problema acontece porque o servidor Web de desenvolvimento do Django reconhee os arquivos estticos relacionados ao layout da aplicao. J no servidor Web Apache, necessrio disponibilizar os arquivos estticos para o servidor. Os arquivos estticos
utilizados na interface de administrao encontram-se no diretrio [instalao do python]/sitepackages/django/contrib/admin/media. Para que o servidor Apache tenha acesso esses arquivos, necessrio criar um link simblico no diretrio raiz dos documentos do Apache, com
o seguinte comando (no sistema operacional linux):

69

ln -s [instalao do python]/site-packages/django/contrib/admin/media media

Figura 60: Link simblico para os arquivos estticos da interface de administrao

Outra forma de disponibilizar estes arquivos para o Apache copiando o diretrio "media" para o diretrio raiz dos documentos do Apache.
Para maiores informaes, o Django Book possui um captulo exclusivo sobre liberao
de aplicaes, disponvel em (HOLOVATY; MOSS, 2006).
O prximo captulo apresenta uma aplicao desenvolvida com o Django para o controle
de alocaes dos professores de uma instituio de ensino.

70

ESTUDO DE CASO: APLICAO WEB UTILIZANDO DJANGO

Este captulo apresenta o estudo de caso do desenvolvimento de uma aplicao Web


utilizando o framework Django para o controle de alocaes de professores em instituies de
ensino. Primeiramente, apresenta uma viso geral sobre o funcionamento da aplicao, os principais requisitos, o modelo entidade-relacionamento das tabelas identificadas e o resultado final
da aplicao desenvolvida, mostrando quais as facilidades e dificuldades encontradas durante
o desenvolvimento.

4.1

VISO GERAL DA APLICAO

A aplicao desenvolvida para este trabalho surgiu da necessidade de facilitar o controle


de alocaes dos professores no Instituto Superior Tupy. At ento, todo o controle era feito com
a utilizao de planilhas.
O controle de alocaes feito com a utilizao de planilhas fornece informaes sobre a
carga horria dos professores, que so alocados em atividades como aula, ensino distncia,
orientao em trabalhos de concluso, entre outras. Estas atividades so desenvolvidas nos
cursos oferecidos pela instituio, de forma que, com a informao sobre a titulao dos professores, possvel saber qual o ndice de titulao dos cursos oferecidos e o ndice de titulao
geral da instituio.
Devido ao nome utilizado para as planilhas, este projeto foi chamado de piramide.

4.2

REQUISITOS

Os requisitos para o projeto piramide solicitados pelos usurios foram os seguintes:


I. Acesso Web;
II. Autenticao dos usurios;
III. Relatrio de carga horria dos professores em determinado semestre;
IV. Relatrio de ndice de titulao do corpo docente geral e de cada curso;
V. Relatrio de professores de um determinado curso;
VI. Comparao de carga horria entre os semestres;

71

4.3

NDICE DE TITULAO DO CORPO DOCENTE

Uma das necessidades do Instituto Superior Tupy possibilidade de visualizar os valores


do ITCD (ndice de Titulao do Corpo Docente) da instituio. O ITCD formado pela mdia
ponderada da mais alta titulao de cada professor (UNIVERSIDADE FEDERAL DE SANTA MARIA,
2007). As titulaes possuem pesos que so multiplicados pela quantidade de professores que
possuem cada titulao. Os resultados destas multiplicaes so somados e o resultado desse
clculo dividido pelo nmero total de professores da instituio.

ITCD =

D.d + M.m + E.e + G.g


d +m+e+g

onde

D = peso para doutorado


M = peso para mestrado
E = peso para especializao
G = peso para graduao
d = nmero de professores com doutorado
m = nmero de professores com mestrado
e = nmero de professores com especializao
g = nmero de professores com graduao
Na aplicao desenvolvida neste estudo de caso, o peso para cada titulao dever ser
informado, ficando sob responsabilidade da instituio classificar o grau de importncia de cada
titulao para o clculo do ITCD.

4.4

MODELAGEM

O modelo entidade-relacionamento do projeto piramide foi desenvolvido a partir das planilhas utilizadas atualmente. A figura 61 mostra o modelo desenvolvido para o projeto.

72

Figura 61: Modelo Entidade Relacionamento do projeto piramide

4.5

DESENVOLVIMENTO DA APLICAO

Aps a definio dos requisitos e da modelagem da aplicao, iniciou-se o desenvolvimento com o framework Django. Inicialmente, foram criados o projeto e as aplicaes que
fariam parte do projeto. As aplicaes foram definidas da seguinte forma:

I. Professores: aplicao responsvel pelo cadastro de professores e titulaes. Estes cadastros foram separados em uma aplicao visando a reutilizao em outros projetos.
II. Instituies: aplicao responsvel por manter as informaes da instituio, como o
cadastro de cursos, semestres e atividades. Esta aplicao foi criada visando uma melhor
organizao do projeto.

73

III. Alocaes: aplicao responsvel por manter as informaes de alocao. a principal aplicao do projeto e o seu funcionamento depende das aplicaes Professores e
Instituio.

Os modelos de dados foram definidos conforme a modelagem do projeto. As definies


foram desenvolvidas no arquivo models.py de cada aplicao, conforme mostrado a seguir:

I. Professores: nesta aplicao foram definidos os modelos Professor e Titulao


II. Instituies: nesta aplicao foram definidos os modelos Semestre, Curso e Atividade
III. Alocaes: nesta aplicao foi definido o modelo Alocao

Aps as definies dos modelos de dados, a interface de administrao disponvel no


framework Django foi ativada e possibilitou realizar a manuteno dos dados da aplicao.
Para atender aos requisitos da aplicao, havia a necessidade da construo de relatrios especficos. Para isso, foram desenvolvidas views, no arquivo views.py da aplicao
Alocaes, e os templates para a apresentao das informaes para o usurio, no diretrio
especificado nas configuraes do projeto.

4.6

RESULTADOS OBTIDOS

A utilizao do framework Django para o desenvolvimento do projeto piramide permitiu


que a aplicao fosse desenvolvida em pouco tempo e de forma organizada, apesar de o autor
possuir pouca experincia com o desenvolvimento Web e com a linguagem Python.
A aplicao desenvolvida atendeu as expectativas e os requisitos dos usurios, que
agora podero realizar o controle das alocaes do Instituto Superior Tupy via Web, com os dados armazenados em um SGBD, garantindo maior segurana e confiabilidade das informaes.
A seguir so apresentadas algumas telas da aplicao.
A figura 62 mostra a tela de acesso aplicao, onde o usurio informa o seu login e a
sua senha de acesso:

74

Figura 62: Pgina de acesso aplicao

A figura 63 mostra a tela inicial da aplicao, que possui uma pequena explicao sobre
a funcionalidade disponvel em cada aba da aplicao:

Figura 63: Pgina inicial da aplicao

A figura 64 mostra o relatrio de carga horria dos professores, onde o usurio informa
um semestre e um professor para consultar a sua carga horria. O relatrio exibe um detalhamento das alocaes do professor selecionado no semestre e o total de horas, juntamente com
a quantidade de horas especificadas no contrato do professor.

75

Figura 64: Relatrio de carga horria

4.7

DIFICULDADES ENCONTRADAS

Durante o desenvolvimento da aplicao, ocorreram pequenos problemas relacionados


atualizao de verso do Django. Para implementar a autenticao de usurios, era necessrio utilizar a opo LOGIN_URL, na configurao do projeto, devido publicao da aplicao
em um diretrio do domnio. Porm, essa opo s est disponvel na verso de desenvolvimento do Django. Ao atualizar a verso, o Django apresentou erros no modelo de dados
Professor, no campo salario, do tipo FloatField. Para resolver este problema, foi necessrio
rever a documentao referente aos modelos de dados do Django, que informava sobre a mudana de comportamento do FloatField e sobre o novo tipo de campo, chamado DecimalField,
que atendia as necessidades da aplicao.
Uma dificuldade, que aparentemente um problema no Django, foi a serializao dos
dados para o formato JSON, utilizado nas requisies AJAX. Os campos disponveis no modelo de dados so serializados corretamente, porm campos adicionais, includos no QuerySet
com a utilizao do mtodo extra() no foram serializados. A soluo para este problema foi
desenvolver um template no formato JSON para transferir os dados.
Utilizando o navegador Firefox, a aplicao apresentou o funcionamento esperado. Porm, ao tentar acessar a aplicao com o navegador Internet Explorer, ocorrem problemas com
a leitura dos dados no formato JSON. Alm disso, o interface da aplicao ficou desconfigurada,
devido utilizao de recursos da linguagem CSS no compatveis com o navegador Internet
Explorer. O navegador Internet Explorer no implementa todos os padres da linguagem CSS
definidos pela W3C Consortium.

76

CONCLUSO

A demanda pelo desenvolvimento de aplicaes Web est constante crescimento, fazendo com que a procura por profissionais que possuam o conhecimento necessrio para a
construo dessas aplicaes seja grande. Porm, as ferramentas utilizadas atualmente pela
maioria das organizaes para o desenvolvimento de aplicaes Web so complexas e dificultam a busca por profissionais qualificados. Outra desvantagem do uso de tais ferramentas o
tempo gasto no desenvolvimento das aplicaes, que tende a ser elevado.
Como alternativa para as ferramentas atualmente utilizadas no desenvolvimento, este
trabalho apresentou o Django, um framework de desenvolvimento de aplicaes Web que tem
por objetivo facilitar o desenvolvimento das aplicaes, diminuir o tempo utilizado no desenvolvimento e manter a organizao do cdigo das aplicaes desenvolvidas.
A primeira impresso que o desenvolvedor tem com o Django de que tudo muito
fcil, devido a criao automtica da interface de administrao para a manuteno dos dados da aplicao. Porm, no momento da criao das pginas especficas para a exibio do
contedo armazenado, necessrio que o desenvolvedor entenda o fluxo de funcionamento
entre os models, as views e os templates utilizados no desenvolvimento de aplicaes Web
com o framework Django. necessrio tambm que o desenvolvedor possua conhecimentos
no desenvolvimento de pginas HTML e na utilizao da linguagem CSS, pois o Django no
auxilia o desenvolvedor na criao da interface da aplicao, com excesso da interface de
administrao.
A utilizao da linguagem Python facilita a codificao da aplicao, e importante que
o desenvolvedor possua conhecimentos bsicos na linguagem. Os objetos do tipo dicionrio
so muito utilizados, assim como as listas e as tuplas. A configurao das URLs da aplicao
utilizando expresses regulares muito poderosa, porm um pouco complicada para quem no
domina este recurso. Porm, a consulta aos exemplos disponveis na documentao oficial
suficiente para auxiliar o desenvolvedor na configurao das URLs da sua aplicao.
Para verificar se o framework Django era realmente uma boa ferramenta para o desenvolvimento de aplicaes Web, este trabalho apresentou um estudo de caso do desenvolvimento
de uma aplicao para o controle de alocaes dos professores do Instituto Superior Tupy, desenvolvida com o framework Django. Para construir a aplicao, que formada por alguns
cadastros e 4 relatrios, foram gastas aproximadamente 30 horas. Levando em considerao
que o autor estava estudando o Django e no possuia experincia com a linguagem Python,

77

foram utilizadas poucas horas de desenvolvimento. Portanto, possvel concluir que o Django
facilita o desenvolvimento de aplicaes Web e diminui a quantidade de horas gastas com o
desenvolvimento.
Um problema encontrado no Django e que afeta a maioria das solues de cdigo aberto
a quantidade de mudanas realizadas entre uma verso e outra. Essas mudanas contribuem
para a evoluo do framework, porm dificultam a migrao das aplicaes desenvolvidas em
verses anteriores para a verso atual. Durante o desenvolvimento do trabalho, foi necessria
a alterao de alguns exemplos devido a mudana de comportamento de um tipo de campo
oferecido pelo Django. Este tipo de problema deve ocorrer em menor freqncia com o amadurecimento do framework, que muito novo e ainda no chegou na verso 1.0.
Um fator que dificulta a popularizao do framework Django a falta de documentao
em idiomas locais. Toda a documentao est escrita no idioma Ingls e dificulta o aprendizado
dos profissionais que no conheam o idioma. Por esta razo, foram apresentadas neste trabalho as principais funcionalidades do Django, de forma que um desenvolvedor consiga iniciar o
seu aprendizado construindo pequenas aplicaes.
Como sugesto para trabalhos futuros, pode-se estudar as funcionalidades do Django
que no foram apresentadas neste trabalho, como a utilizao do sistema de cache, gerenciamento de sesses, utilizao do Middleware do Django, internacionalizao, views genricas e
apresentar todas as funcionalidades do sistema de templates do Django. Alm disso, pode-se
realizar um estudo comparativo entre o Django e outros frameworks de desenvolvimento de aplicaes Web, estudar a viabilidade da utilizao do Django para o desenvolvimento de solues
Web para gesto empresarial ou estudar a possibilidade de utilizao do framework Django no
ensino superior, em uma disciplina de programao Web.

78

REFERNCIAS
APACHE SOFTWARE FOUNDATION. About the Apache HTTP Server Project. 2007.
Disponvel em: http://httpd.apache.org/ABOUT_APACHE.html.
Acesso em: 04 abr. 2007.
BAREINBOIM, E. Conhea o Apache 2.0. 2006. Disponvel em:
http://olinux.uol.com.br/artigos/405/1.html.
Acesso em: 04 abr. 2007.
BERNERS-LEE, T. Hypertext Style: Cool URIs dont change. 1998. Disponvel em:
http://www.w3.org/Provider/Style/URI.
Acesso em: 10 mai. 2007.
DEITEL, H. et al. Python How To Program. New Jersey: Prentice Hall, 2002. ISBN
0-13-092361-3.
DJANGO SOURCE CODE. DjangoPoweredSites - Django Code. 2007. Disponvel em:
http://code.djangoproject.com/wiki/DjangoPoweredSites.
Acesso em: 09 mai. 2007.
DRAKE, J. D. A Brief Introduction to Apaches mod_python Module. 2005. Disponvel em:
http://www.devx.com/webdev/Article/29357.
Acesso em: 05 abr. 2007.
GALDINO, C. Manual Javascript. 2006. Disponivel em:
http://bardo.castelodotempo.com/javascript.
Acesso em: 06 abr. 2007.
HOLOVATY, A.; MOSS, J. K.
http://www.djangobook.com.
Acesso em: 06 mar. 2007.

The Django Book. 2006. Disponvel em:

LAWRENCE JOURNAL-WORLD.
http://www.djangoproject.com.
Acesso em: 09 mai. 2007.

Django Project. 2007. Disponvel em:

MYSQL AB. MySQL Reference Manual. 2007. Disponvel em:


http://dev.mysql.com/doc/refman/5.1/en.
Acesso em: 06 abr. 2007.
NETCRAFT. Netcraft: Web Server Survey Archives. 2007. Disponvel em:
http://news.netcraft.com/archives/web_server_survey.html.
Acesso em: 04 abr. 2007.
POSTGRESQL GLOBAL DEVELOPMENT GROUP. Date/Time Key Words. 2007. Disponvel
em: http://www.postgresql.org/docs/8.1/static/datetime-keywords.html#DATETIME-TIMEZONESET-TABLE.
Acesso em: 16 mai. 2007.
PRESSMAN, R. S. Engenharia de Software. 6a . ed. So Paulo: McGraw-Hill, 2006.

79

RAGGETT, D. Getting started with HTML. 2005. Disponvel em:


http://www.w3.org/MarkUp/Guide.
Acesso em: 05 abr. 2007.
SAUV, J. P. Frameworks. 2003. Disponvel em: http://www.dsc.ufcg.edu.br/ jacques/cursos/map/html/frame/oque.htm.
Acesso em: 21 mar. 2007.
SILVA, M. S. CSS Tutorial. 2007. Disponvel em: http://pt-br.html.net/tutorials/css.
Acesso em: 04 abr. 2007.
THE INTERNET SOCIETY. RFC 2616 Hypertext Transfer Protocol HTTP/1.1. 1999.
Disponvel em: http://tools.ietf.org/html/rfc2616.
Acesso em: 04 abr. 2007.
THOMAS, D.; HANSSON, D. H. Agile Web Development with Rails. 2a . ed. Dallas: The
Pragmatic Programmers LLC, 2007. ISBN 0-9776166-3-0.
TRUBETSKOY, G. Introducing mod_python. 2003. Disponvel em:
http://www.onlamp.com/pub/a/python/2003/10/02/mod_python.html.
Acesso em: 05 abr. 2007.
UNIVERSIDADE FEDERAL DE SANTA MARIA. Comisso Executiva de
Avaliao Institucional - Variveis e Indicadores. 2007. Disponvel em:
http://www.ufsm.br/proplan/cpavi/variaveis.html.
Acesso em: 23 jul. 2007.
W3C. HTML 4.01 Specification. 1999. Disponvel em: http://www.w3.org/TR/html401.
Acesso em: 05 abr. 2007.
W3C. Scripts in HTML Documents. 1999. Disponvel em:
http://www.w3.org/TR/html401/interact/scripts.html.
Acesso em: 05 abr. 2007.
WIKIPEDIA. Framework - Wikipedia. 2006. Disponvel em:
http://pt.wikipedia.org/wiki/Framework.
Acesso em: 15 nov. 2006.
WIKIPEDIA. Palndromo - Wikipedia. 2007. Disponvel em:
http://pt.wikipedia.org/wiki/Pal%C3%ADndromo.
Acesso em: 23 jul. 2007.
WIKIPEDIA. Web server - Wikipedia. 2007. Disponvel em:
http://en.wikipedia.org/wiki/Web_server.
Acesso em: 04 abr. 2007.
ZELLE, J. M. Python as a First Language. 1999. Disponvel em:
http://mcsp.wartburg.edu/zelle/python/python-first.html.
Acesso em: 12 fev. 2007.

80

APNDICE A -- MODELO DE DADOS DA


APLICAO PROFESSORES

Este apndice apresenta o arquivo models.py da aplicao Professores.

professores/models.py
1

from django . db import models

class T i t u l a c a o ( models . Model ) :

d e s c r i c a o = models . C h a r F i e l d ( maxlength =50 , b l a n k = False )

pontos

def _ _ s t r _ _ ( s e l f ) :

= models . I n t e g e r F i e l d ( b l a n k = False )

return s e l f . descricao

class Admin :

pass

class Meta :

10
11

verbose_name_plural = " Titulaes "


class P r o f e s s o r ( models . Model ) :

12

matricula

= models . C h a r F i e l d ( maxlength =50 , b l a n k = False )

13

nome

= models . C h a r F i e l d ( maxlength =100 , b l a n k = False )

14

endereco

= models . C h a r F i e l d ( maxlength =100 , b l a n k =True )

15

bairro

= models . C h a r F i e l d ( maxlength =50 , b l a n k =True )

16

cidade

= models . C h a r F i e l d ( maxlength =50 , b l a n k =True )

17

uf

= models . C h a r F i e l d ( maxlength =2 , b l a n k =True )

18

telefone

= models . C h a r F i e l d ( maxlength =20 , b l a n k =True )

19

email

= models . E m a i l F i e l d ( b l a n k =True )

20

salario

= models . D e c i m a l F i e l d ( m a x _ d i g i t s =10 , d ec im a l_ p l a c e s =2)

21

h o r a s _ c o n t r a t o = models . I n t e g e r F i e l d ( b l a n k =False )

22

titulacao

23

def _ _ s t r _ _ ( s e l f ) :

24
25

= models . ForeignKey ( T i t u l a c a o , b l a n k = False )

r e t u r n s e l f . nome
class Admin :

26

l i s t _ d i s p l a y = ( " matricula " , "nome" , " t i t u l a c a o " , " email " , " telefone " )

27

list_filter

= ( " titulacao " ,)

81
28
29
30

s e a r c h _ f i e l d s = ( "nome" , " matricula " , )


class Meta :
verbose_name_plural = " Professores "

82

APNDICE B -- MODELO DE DADOS DA


APLICAO INSTITUIES

Este apndice apresenta o arquivo models.py da aplicao Instituies.

instituicoes/models.py
1

from django . db import models

class Curso ( models . Model ) :

codigo

= models . C h a r F i e l d ( maxlength =5 , b l a n k =False )

descricao

= models . C h a r F i e l d ( maxlength =50 , b l a n k = False )

c e n t r o _ c u s t o = models . C h a r F i e l d ( maxlength =30)

def _ _ s t r _ _ ( s e l f ) :

7
8
9
10
11
12

r e t u r n s e l f . codigo
class Meta :
verbose_name_plural = " Cursos "
class Admin :
l i s t _ d i s p l a y = ( codigo , descricao , centro_custo , )
class A t i v i d a d e ( models . Model ) :

13

d e s c r i c a o = models . C h a r F i e l d ( maxlength =50 , b l a n k = False )

14

def _ _ s t r _ _ ( s e l f ) :

15
16
17
18
19
20

return s e l f . descricao
class Meta :
verbose_name_plural = " Atividades "
class Admin :
l i s t _ d i s p l a y = ( descricao , )
class Semestre ( models . Model ) :

21

semestre_ano = models . C h a r F i e l d ( maxlength =10 , b l a n k =False )

22

def _ _ s t r _ _ ( s e l f ) :

23
24
25
26
27

r e t u r n s e l f . semestre_ano
class Meta :
verbose_name_plural = " Semestres "
class Admin :
l i s t _ d i s p l a y = ( semestre_ano , )

83

APNDICE C -- MODELO DE DADOS DA


APLICAO ALOCAES

Este apndice apresenta o arquivo models.py da aplicao Alocaes.

alocacoes/models.py
1

from django . db import models

from p i r a m i d e . p r o f e s s o r e s . models

from p i r a m i d e . i n s t i t u i c o e s . models import Curso , Semestre , A t i v i d a d e

class Alocacao ( models . Model ) :

import P r o f e s s o r

semestre

= models . ForeignKey ( Semestre , b l a n k =False )

professor

= models . ForeignKey ( P r o f e s s o r , b l a n k = False )

curso

= models . ForeignKey ( Curso , b l a n k =False )

atividade

= models . ForeignKey ( A t i v i d a d e , b l a n k = False )

horas_aula

= models . I n t e g e r F i e l d ( b l a n k = False )

10
11

def _ _ s t r _ _ ( s e l f ) :
r e t u r n s e l f . semestre . _ _ s t r _ _ ( ) +

+ s e l f . curso . _ _ s t r _ _ ( ) + " " +

s e l f . professor . __str__ ( )

12
13
14
15

class Meta :
verbose_name_plural = " Alocacoes "
class Admin :
list_display

= ( semestre , professor , curso , atividade , horas_aula

,)
16

list_filter

= ( semestre , atividade , curso , )

17

s e a r c h _ f i e l d s = ( professor , )

84

APNDICE D -- CONFIGURAO DAS URLS

Este apndice apresenta os arquivos de configurao de URL do projeto Piramide.

urls.py
1

from django . c o n f . u r l s . d e f a u l t s import

urlpatterns = patterns ( ,

( r ^ , i n c l u d e ( piramide . alocacoes . u r l s ) ) ,

( r ^admin / , i n c l u d e ( django . c o n t r i b . admin . u r l s ) ) ,

( r ^site_media / ( ?P<path >. )$ , django . views . s t a t i c . serve , { document_root

: / root / dev / django / piramide / media / } ) , # No u t i l i z a d o no ambiente de


produo

( r ^accounts / l o g i n / , django . c o n t r i b . auth . views . l o g i n , { template_name :

admin / l o g i n . html } ) ,
7
9

( r ^accounts / logout / $ , django . c o n t r i b . auth . views . logout ) ,

alocacoes/urls.py
1

from django . c o n f . u r l s . d e f a u l t s import

u r l p a t t e r n s = p a t t e r n s ( piramide . alocacoes . views ,

( r ^$ , index ) ,

( r ^ carga_horaria / $ , carga_horaria ) ,

( r ^ carga_horaria / ( ?P<semestre >\d+) / ( ?P<professor >\d+) / $ ,

relatorio_carga_horaria ) ,
6

( r ^ indice_titulacao /$ , indice_titulacao ) ,

( r ^ professor_curso / $ , professor_curso ) ,

( r ^ professor_curso / ( ?P<curso >\d+) / $ , relatorio_professor_curso ) ,

( r ^comparacao_carga / $ , comparacao_carga ) ,

10

( r ^comparacao_carga / ( ?P<semestre_atual >\d+) / ( ?P<semestre_anterior >\d+) / $ ,

relatorio_comparacao_carga ) ,
11

85

APNDICE E -- LGICA DOS RELATRIOS

Este apndice apresenta o arquivo views.py da aplicao Alocaes, onde est codificada toda a lgica relacionada aos relatrios da aplicao.

alocacoes/views.py
1

from django . h t t p import HttpResponse

from django . t e m p l a t e . l o a d e r import g e t _ t e m p l a t e

from django . t e m p l a t e import Context

from django . c o n t r i b . auth . d e c o r a t o r s import l o g i n _ r e q u i r e d

from p i r a m i d e . p r o f e s s o r e s . models import P r o f e s s o r

from p i r a m i d e . i n s t i t u i c o e s . models import Semestre , Curso

from p i r a m i d e . alocacoes . models import Alocacao

@login_required

10

def i n d e x ( r e q u e s t ) :

11

t = g e t _ t e m p l a t e ( " alocacoes / index . html " )

12

h t m l = t . r e n d e r ( Context ( ) )

13

r e t u r n HttpResponse ( h t m l )

15

@login_required

16

def c a r g a _ h o r a r i a ( r e q u e s t ) :

17

professores = Professor . objects . a l l ( )

18

semestres = Semestre . o b j e c t s . a l l ( )

19

t = g e t _ t e m p l a t e ( " alocacoes / carga_horaria . html " )

20

c = Context ( { " professores " : p r o f e s s o r e s , " semestres " : semestres } )

21

html = t . render ( c )

22

r e t u r n HttpResponse ( h t m l )

24

@login_required

25

def r e l a t o r i o _ c a r g a _ h o r a r i a ( request , semestre , p r o f e s s o r ) :

26

alocacoes = Alocacao . o b j e c t s . f i l t e r ( semestre__exact = semestre ,


professor__exact = professor )

27

total_horas = 0

86
28
29

f o r i t e m i n alocacoes :
t o t a l _ h o r a s += i t e m . horas_aula

30

t = g e t _ t e m p l a t e ( " alocacoes / json_carga_horaria . t x t " )

31

c = Context ( { " alocacoes " : alocacoes , " t o t a l " : t o t a l _ h o r a s } )

32

resultado = t . render ( c )

33

r e t u r n HttpResponse ( r e s u l t a d o )

35

@login_required

36

def i n d i c e _ t i t u l a c a o ( r e q u e s t ) :

37

indice_geral = 0

38

contador_geral = 0

39

indices = [ ]

40

cursos = Curso . o b j e c t s . a l l ( )

41

f o r i t e m i n cursos :

42

alocacoes = Alocacao . o b j e c t s . s e l e c t _ r e l a t e d ( ) . f i l t e r ( curso = i t e m . i d )

43

indice_curso = 0

44

c on ta do r_ cu rs o = 0

45

f o r alocacao i n alocacoes :

46

i n d i c e _ c u r s o += alocacao . p r o f e s s o r . t i t u l a c a o . pontos

47

c on ta do r_ cu rs o += 1 . 0

48

i n d i c e _ g e r a l += i n d i c e _ c u r s o

49

c o n t a d o r _ g e r a l += c o n t a d o r _ c u r s o

50

i f c on ta do r_ cu rs o > 0 :

51
52

indice_curso /= contador_curso
else :

53

indice_curso = 0

54

i n d i c e _ g e r a l = round ( i n d i c e _ g e r a l , 2 )

55

i n d i c e _ c u r s o = round ( i n d i c e _ c u r s o , 2 )

56

i n d i c e s . append ( { " curso " : i t e m . codigo , " indice " : i n d i c e _ c u r s o } )

57
58
59
60

i f contador_geral > 0:
indice_geral /= contador_geral
else :
indice_geral = 0

61

t = g e t _ t e m p l a t e ( " alocacoes / i n d i c e _ t i t u l a c a o . html " )

62

c = Context ( { " indices " : i n d i c e s , " geral " : i n d i c e _ g e r a l } )

63

html = t . render ( c )

64

r e t u r n HttpResponse ( h t m l )

66

@login_required

67

def p r o f e s s o r _ c u r s o ( r e q u e s t ) :

68

lista_curso = [ ]

69

alocacoes = Alocacao . o b j e c t s . a l l ( )

70

f o r i t e m i n alocacoes :

87
71

l i s t a _ c u r s o . append ( i t e m . curso . i d )

72

cursos = Curso . o b j e c t s . f i l t e r ( i d _ _ i n = l i s t a _ c u r s o )

73

t = g e t _ t e m p l a t e ( " alocacoes / professor_curso . html " )

74

c = Context ( { " cursos " : cursos } )

75

html = t . render ( c )

76

r e t u r n HttpResponse ( h t m l )

78

@login_required

79

def r e l a t o r i o _ p r o f e s s o r _ c u r s o ( request , curso ) :

80

alocacoes = Alocacao . o b j e c t s . f i l t e r ( curso__exact = curso )

81

lista_professor = [ ]

82

f o r i t e m i n alocacoes :

83

l i s t a _ p r o f e s s o r . append ( i t e m . p r o f e s s o r . i d )

84

professores = Professor . objects . f i l t e r ( id__in = l i s t a _ p r o f e s s o r )

85

t = g e t _ t e m p l a t e ( " alocacoes / json_professor_curso . t x t " )

86

c = Context ( { " professores " : p r o f e s s o r e s } )

87

resultado = t . render ( c )

88

r e t u r n HttpResponse ( r e s u l t a d o )

90

@login_required

91

def comparacao_carga ( r e q u e s t ) :

92

semestres = Semestre . o b j e c t s . a l l ( )

93

t = g e t _ t e m p l a t e ( " alocacoes / comparacao_carga . html " )

94

c = Context ( { " semestres " : semestres } )

95

html = t . render ( c )

96

r e t u r n HttpResponse ( h t m l )

98

@login_required

99

def r e l a t o r i o _ c o m p a r a c a o _ c a r g a ( request , s e m e s t r e _ a t u a l =1 , s e m e s t r e _ a n t e r i o r =1)


:

100

p r o f e s s o r e s = P r o f e s s o r . o b j e c t s . a l l ( ) . order_by ( "nome" )

101

lista_carga = [ ]

102

for professor in professores :

103

carga_atual = 0

104

carga_anterior = 0

105

alocacoes = Alocacao . o b j e c t s . f i l t e r ( semestre__exact = semestre_atual ,


professor__exact = professor . id )

106
107
108

f o r alocacao i n alocacoes :
c a r g a _ a t u a l += alocacao . horas_aula
alocacoes = Alocacao . o b j e c t s . f i l t e r ( semestre__exact = s e m e s t r e _ a n t e r i o r
, professor__exact = professor . id )

109
110

f o r alocacao i n alocacoes :
c a r g a _ a n t e r i o r += alocacao . horas_aula

88
111

diferenca = carga_atual carga_anterior

112

v a l o r e s = { " professor " : p r o f e s s o r . nome , " horas_contrato " : p r o f e s s o r .


h o r a s _ c o n t r a t o , " horas_semestre_atual " : c a r g a _ a t u a l , "

horas_semestre_anterior " : c a r g a _ a n t e r i o r , " diferenca " : d i f e r e n c a }


113

l i s t a _ c a r g a . append ( v a l o r e s )

114

t = g e t _ t e m p l a t e ( " alocacoes / json_comparacao_carga . t x t " )

115

c = Context ( { " carga_horaria " : l i s t a _ c a r g a } )

116

resultado = t . render ( c )

117

r e t u r n HttpResponse ( r e s u l t a d o )

89

APNDICE F -- TEMPLATE BASE

Este apndice apresenta o arquivo index.html, utilizado como base para o desenvolvimento dos outros templates da aplicao.

templates/alocacoes/index.html
1

< !DOCTYPE HTML PUBLIC " //W3C/ /DTD HTML 4 . 0 1 / /EN" " h t t p : / /www.w3. org /TR/ html4 /

s t r i c t . dtd " >


2

<html>

<head>

<meta h t t p e q u i v = " Contenttype " content= " t e x t / html ; charset=u t f 8" >

< l i n k r e l = " stylesheet " type= " t e x t / css " h r e f = " / site_media / css / s t y l e . css " / >

< s c r i p t language= " j a v a s c r i p t " >

f u n c t i o n getHTTPRequest ( ) {

v a r h tt p Re q ue s t = n u l l ;

/ / Firefox

10

i f ( window . XMLHttpRequest ) {

11

h tt p Re q ue s t = new XMLHttpRequest ( ) ;

12

13

/ / IE Para implementao f u t u r a

14

e l s e i f ( window . A c t i v e X O b j e c t ) {

15

try {

16

h tt p Re q ue s t = new A c t i v e X O b j e c t ( "Msxml2 .XMLHTTP" ) ;

17

18

catch ( e ) {

19

try {

20

h tt p Re q ue s t = new A c t i v e X O b j e c t ( " Microsoft .XMLHTTP" ) ;

21

22

catch ( e ) {

23

h tt p Re q ue s t = f a l s e ;

24

25

26

27

r e t u r n h t t p R e qu e st ;

90
28

29

f u n c t i o n changeItem ( i t e m ) {

30

i f ( document . getElementById ( " current " ) )

31

document . getElementById ( " current " ) . i d = " " ;

32

i t e m . i d = " current " ;

33

34

< / script>

35

{% b l o c k s c r i p t %}

36

{% endblock %}

37

< t i t l e > C o n t r o l e de Alocaes< / t i t l e >

38

< / head>

39

<body>

40
41

<div i d = " cabecalho " >


<h1><a h r e f = " / " >{% b l o c k t i t u l o %} C o n t r o l e de Alocaes{% endblock %}< /
a>< / h1>

42

<div i d = " painelabas " >

43

< u l i d = " abas " >

44

< l i ><a i d = " tab1 " h r e f = " / carga_horaria / " >Carga H o r r i a < / a>< / l i >

45

< l i ><a i d = " tab2 " h r e f = " / i n d i c e _ t i t u l a c a o / " > n d i c e de T i t u l a o <


/ a>< / l i >

46

< l i ><a i d = " tab3 " h r e f = " / professor_curso / " > L i s t a de P r o f e s s o r e s


por Curso< / a>< / l i >
< l i ><a i d = " tab4 " h r e f = " / comparacao_carga / " >Comparao Carga

47

H o r r i a < / a>< / l i >

48

< l i ><a i d = " tab5 " h r e f = " / admin / " > A d m i n i s t r a o < / a>< / l i >

49

< l i s t y l e = " f l o a t : r i g h t " ><a i d = " tab6 " h r e f = " / accounts / logout / " >
S a i r < / a>< / l i >

50
51

< / ul>
< / div>

52

< / div>

53

{% b l o c k conteudo %}

54

<div i d = " resultado " >

55

<h1>Bem v i n d o ao C o n t r o l e de Alocaes ! < / h1>

56

<br>

57

<p>Essa a p l i c a o f o i d e s e n v o l v i d a como estudo de caso para o t r a b a l h o


de concluso de curso do aluno Fabio Eduardo Thomaz , para a
obteno de grau de b a c h a r e l em Sistemas de Informao , sob
o r i e n t a o do P r o f e s s o r MSc . Marco Andr Lopes Mendes . < / p>

58

<p>Para uma melhor organizao , essa a p l i c a o f o i d i v i d i d a em abas ,


com as s e g u i n t e s f u n c i o n a l i d a d e s : < / p>

59
60

<ul id=" lista_funcionalidades ">


< l i ><strong>Carga H o r r i a < / strong><br> R e l a t r i o de carga h o r r i a
dos p r o f e s s o r e s em um determinado semestre< / l i >

91
61

<br>< l i ><strong> n d i c e de T i t u l a o < / strong><br> R e l a t r i o do n d i c e


de t i t u l a o g e r a l e por curso < / l i >

62

<br>< l i ><strong> L i s t a de P r o f e s s o r e s por Curso< / strong><br>Fornece


uma l i s t a dos p r o f e s s o r e s alocados em determinado curso < / l i >
<br>< l i ><strong>Comparao Carga H o r r i a < / strong><br> R e a l i z a uma

63

comparao e n t r e a carga h o r r i a de d o i s semestres ,


selecionados pelo usurio< / l i >

64

<br>< l i ><strong> A d m i n i s t r a o < / strong><br> P o s s i b i l i t a a manuteno


dos dados da a p l i c a o < / l i >

65

< / ul>

66

< / div>

67

{% endblock %}

68

< / body>

69

< / html>

92

APNDICE G -- TEMPLATE CARGA HORRIA

Este apndice apresenta o arquivo carga_horaria.html, utilizado para exibio do relatrio de carga horria dos professores por semestre.

templates/alocacoes/carga_horaria.html
1

{% extends " alocacoes / index . html " %}

{% b l o c k s c r i p t %}

< s c r i p t language= " JavaScript " >

function getRelatorio () {

v a r u r l = " / carga_horaria / " + document . getElementById ( " sel_semestre " ) . v a l u e


+

" / " + document . getElementById ( " sel_professor " ) . v a l u e + " / " ;

var resultado ;

v a r h tt p Re q ue s t = getHTTPRequest ( ) ;

h tt p Re q ue s t . open ( "GET" , u r l , t r u e ) ;

10

h tt p Re q ue s t . onreadystatechange = f u n c t i o n ( ) {

11

i f ( h t tp R eq u es t . r e a d y S t a t e == 4 ) {

12

i f ( h t tp R eq u es t . s t a t u s == 200) {

13

r e s u l t a d o = e v a l ( " ( " + h t t pR e q u e st . responseText + " ) " ) ;

14

montaRelatorio ( resultado ) ;

15

} else {

16

a l e r t ( " Erro na transmisso de dados" ) ;

17

18

h tt p Re q ue s t = n u l l ;

19

20

};

21

h tt p Re q ue s t . send ( n u l l ) ;

22

23

f u n c t i o n m o n t a R e l a t o r i o ( dados ) {

24

var divRelat ;

25

var tabela ;

26

v a r tbody ;

27

var l i n h a ;

93
28

var v a l o r ;

29

v a r h3 ;

30

t a b e l a = document . createElement ( " table " ) ;

31

tabela . s e t A t t r i b u t e ( " id " , " tableresult " ) ;

32

d i v R e l a t = document . getElementById ( " resultado " ) ;

33

d i v R e l a t . innerHTML = " " ;

34

t a b e l a = document . createElement ( t a b l e ) ;

35

tbody = document . createElement ( tbody ) ;

37

criaColunaCabecalho ( tbody , " Semestre " ) ;

38

criaColunaCabecalho ( tbody , " Professor " ) ;

39

criaColunaCabecalho ( tbody , " Curso " ) ;

40

criaColunaCabecalho ( tbody , " Atividade " ) ;

41

criaColunaCabecalho ( tbody , " Horas Aula " ) ;

42

t a b e l a . appendChild ( tbody ) ;

43

f o r ( i = 0 ; i < dados . l e n g t h ; i ++) {

44

linha

= document . createElement ( " t r " ) ;

45

c r i a C o l u n a ( l i n h a , dados [ i ] . f i e l d s . semestre ) ;

46

c r i a C o l u n a ( l i n h a , dados [ i ] . f i e l d s . p r o f e s s o r ) ;

47

c r i a C o l u n a ( l i n h a , dados [ i ] . f i e l d s . curso ) ;

48

c r i a C o l u n a ( l i n h a , dados [ i ] . f i e l d s . a t i v i d a d e ) ;

49

c r i a C o l u n a ( l i n h a , dados [ i ] . f i e l d s . horas_aula ) ;

50

tbody . appendChild ( l i n h a ) ;

51

52

t a b e l a . appendChild ( tbody ) ;

53

d i v R e l a t . appendChild ( t a b e l a ) ;

54

h3 = document . createElement ( "h3" ) ;

55

v a l o r = document . createTextNode ( " Total : " + dados [ 0 ] . f i e l d s . t o t a l + " horas

");
56

h3 . appendChild ( v a l o r ) ;

57

d i v R e l a t . appendChild ( h3 ) ;

58

h3 = document . createElement ( "h3" ) ;

59

v a l o r = document . createTextNode ( " Horas do Contrato : " + dados [ 0 ] . f i e l d s .


h o r a s _ c o n t r a t o + " horas " ) ;

60

h3 . appendChild ( v a l o r ) ;

61

d i v R e l a t . appendChild ( h3 ) ;

62

63

f u n c t i o n criaColunaCabecalho ( tbody , conteudo ) {

64

var l i n h a

65

var v a l o r = document . createTextNode ( conteudo ) ;

66

l i n h a . appendChild ( v a l o r ) ;

67

tbody . appendChild ( l i n h a ) ;

68

= document . createElement ( " th " ) ;

94
69

f u n c t i o n c r i a C o l u n a ( l i n h a , conteudo ) {

70

var coluna = document . createElement ( " td " ) ;

71

var v a l o r = document . createTextNode ( conteudo ) ;

72

coluna . appendChild ( v a l o r ) ;

73

l i n h a . appendChild ( coluna ) ;

74

75

</ s c r i p t >

76

{% endblock %}

77

{% b l o c k conteudo %}

78

<script>

79

j a v a s c r i p t : changeItem ( document . getElementById ( " tab1 " ) ) ;

80

< / script>

81

<div i d = " conteudo " >

82

<table>

83

<tr>

84

<td width= "400" v a l i g n = " top " >

85

<div i d = " selecao " >

86

<p>Semestre :

87

< s e l e c t i d = " sel_semestre " onchange= " getRelatorio ( ) " >

88

{% f o r semestre i n semestres %}

89

<option value= " { { semestre . i d } } " > { { semestre . semestre_ano } }


< / option>

90

{% e n d f o r %}

91

< / select>

92

< / p>

93

<p> P r o f e s s o r :

94

< s e l e c t i d = " sel_professor " onchange= " getRelatorio ( ) " >

95

{% f o r p r o f e s s o r i n p r o f e s s o r e s %}

96

<option value= " { { professor . i d } } " > { { p r o f e s s o r . nome } } < /


option>

97

{% e n d f o r %}

98

< / select>

99

< / p>

100

< / div>

101

< / td>

102

<td width= "60%" >

103

<div i d = " resultado " >

105

< / div>

106

< / td>

107

</ tr>

108

< / table>

109

< / div>

95
110
111

<script>
javascript : getRelatorio () ;

112

< / script>

113

{% endblock %}

You might also like