Curso de Python Aula 8 - Tópicos Especiais Bruno Gama Catão brunogamacatao@gmail.com
Agenda • Django + Adobe Flex; • PyGame; • Django + UOL PagSeguro; • Django + Apache; • Dicas.
Django + Adobe Flex • Aplicações web são normalmente organizadas em 3 camadas: Apresentação Lógica Dados • Django acelera muito o desenvolvimento das camadas de lógica e de dados, mas não faz muito pela camada de apresentação.
Camada de Apresentação Aplicações+ Web+ Baseadas+ RIA+ HTML5+ em+HTML+ Microso<+ Adobe+Flex+ Java+FX+ Siverlight+
Adobe Flex • Motivação: • Cerca de 95% dos browsers têm o plugin do Flash instalado; • Desenvolvimento de aplicações web, para diferentes browsers, com HTML e CSS é difícil; • A tecnologia Adobe Flex produz aplicações web “bonitas” de forma mais produtiva.
Arquitetura Layout MXML$ SWF$ Flex%SDK% (Flash)$ AS$ Lógica
Ferramentas • Adobe Flex SDK: • Grátis; • Compilador (linha de comando) de arquivos MXML e AS para SWF; • Versões para Windows, Linux e Mac. • Adobe Flex Builder: • Editor visual integrado com o Eclipse; • Ferramenta paga: • Versão profissional: R$ 400,00 • Versão acadêmica: Grátis; • Versões para Windows e Mac.
Integração de Flex com Tecnologias de Servidor • Flex é uma tecnologia apenas para camada de apresentação; • O lado servidor da aplicação pode ser implementado com a tecnologia que preferir (Java, PHP, Python, Ruby, .NET, etc); • A comunicação pode ser feita: • WebServices (XML ou JSON); lento e genérico • Canais AMF. solução mais rápida e simples
Antes de começar • LEMBREM-SE !!! • Abram o prompt de comando (terminal); • Configurem as variáveis de ambiente do seu computador: • No Windows (Linux não precisa): PATH=%PATH%;C:Python26;C:Python26scripts
PyAMF • Implementação do protocolo AMF para a linguagem de programação Python; • Instalação: • Setup tools: • easy_install pyamf prefira esta forma • Ou, download do site http://pyamf.org
Instalando o Flex Builder • O Adobe Flex Builder vem de duas formas: • Plugin para o Eclipse; • Distribuição do Eclipse adaptada; • Para esta aula dispomos do Adobe Flex Builder Eclipse Plugin versão 3.0; • Atenção, este plugin apenas funciona na versão 3.4 (Ganymede) do Eclipse.
Configurando Django + PyAmf • Dentro da sua aplicação crie um módulo chamado amfgateway; • Modifique o módulo urls principal, criando uma regra para o amf gateway.
Módulo amfgateway import pyamf from pyamf.remoting.gateway.django import DjangoGateway import meuprojeto.aplicacao.views as views from meuprojeto.aplicacao import models services = { 'Servicos': views, } pyamf.register_package(models, 'meuprojeto.aplicacao.models') meuGateway = DjangoGateway(services, expose_request=False)
Módulos urls urlpatterns = patterns('', ... (r'^gateway/', 'meuprojeto.aplicacao.amfgateway.meuGateway'), )
E no lado Flex ? <mx:RemoteObject id="servicos" endpoint="http://localhost:8000/gateway/" destination="Servicos"> ... </mx:RemoteObject>
Exemplo
PyGame • Implementação da biblioteca SDL para a linguagem de programação Python; • Permite a utilização de imagens, sons e dispositivos de entrada facilmente em programas Python.
Primeiro exemplo
Primitivas e Teclado
Imagens
Sons
UOL PagSeguro • O PagSeguro é um componente que permite a sites receber pagamentos de diferentes fontes: • Cartões de crédito; • Boletos bancários.
UOL PagSeguro • Funcionamento: • Você deve se cadastrar no PagSeguro: • http://www.pagseguro.com.br • Seu site deve enviar os dados para o PagSeguro com o seu número de cliente; • O PagSeguro irá intermediar todo o processo de pagamento; • Assim que o pagamento tenha sido confirmado, o PagSeguro irá notificar a sua aplicação.
Formulário
<form action='https://pagseguro.uol.com.br/security/webpagamentos/webpagto.aspx' method='POST'> <input type="hidden" name="email_cobranca" value="brunogamacatao@gmail.com"/> <input type="hidden" name="tipo" value="CP"/> <input type="hidden" name="moeda" value="BRL"/> <input type="hidden" name="ref_transacao" value="{{referenciaCompra}}"/> <input type="hidden" name="cliente_nome" value="{{nomeCompleto}}"/> <input type="hidden" name="cliente_cep" value="{{cep}}"/> <input type="hidden" name="cliente_end" value="{{endereco}}"/> <input type="hidden" name="cliente_num" value="{{numero}}"/> <input type="hidden" name="cliente_compl" value="{{complemento}}"/> <input type="hidden" name="cliente_bairro" value="{{bairro}}"/> <input type="hidden" name="cliente_cidade" value="{{cidade.nome}}"/> <input type="hidden" name="cliente_uf" value="{{estado.sigla}}"/> <input type="hidden" name="cliente_pais" value="BRA"/> <input type="hidden" name="cliente_ddd" value="{{telefone_ddd}}"/> <input type="hidden" name="cliente_tel" value="{{telefone}}"/> <input type="hidden" name="cliente_email" value="{{email}}"/> <input type="hidden" name="encoding" value="utf-8"/> {{for produto in produtos}} <input type="hidden" name="item_id_{{forloop.counter}}" value="{{produto.id}}"/> <input type="hidden" name="item_descr_{{forloop.counter}}" value="{{produto.titulo}}"/> <input type="hidden" name="item_quant_{{forloop.counter}}" value="{{produto.quantidade}}"/> <input type="hidden" name="item_valor_{{forloop.counter}}" value="{{produto.valor * 10)}"/> <input type="hidden" name="item_frete_{{forloop.counter}}" value="{{produto.valor_frete}}"/> <input type="hidden" name="item_peso_{{forloop.counter}}" value="{{produto.peso}}"/> {{end for}} </form>
Módulo pagseguro.py
import sys import urllib2, urllib from django.http import HttpResponse     class Pagamento(object):   def _conectar(self, url, params): query_str = urllib.urlencode(params) req = urllib2.Request(url, query_str) f = urllib2.urlopen(req) conteudo = f.read() f.close() return conteudo   def _enviar(self, url, params): retorno = self._conectar(url, params) if retorno.lower() == 'verificado': return True else: return False   PS_URL = 'https://pagseguro.uol.com.br/Security/NPI/Default.aspx' class PagSeguro(Pagamento): def processar(self, token, params, url=PS_URL): if not params: return False else: lista = [] for key in params.keys(): lista.append((key,params[key])) lista.append(('Comando', 'validar')) lista.append(('Token', token))   return self._enviar(url, lista)
Função concluir
def concluir(request): if request.method == 'POST': # token gerado no painel de controle do PagSeguro token = '12345699CA2AAAF4599EA697BB2F7FFF' p = PagSeguro() retorno = p.processar(token, request.POST)   if retorno == True: try: # Cadastra os dados recebidos no banco de dados. # Utilize o request.POST.get('nomedocampo') para obter os valores except: pass return HttpResponse('Ok') else: return HttpResponse('Error')   else: # Carrega tela contendo a mensagem de compra realizada return direct_to_template(request,'carrinho/concluir.html')
Django + Apache • O servidor web integrado do Django deve ser utilizado apenas para desenvolvimento e testes; • Quando for implantar a sua aplicação em produção utilize o Apache.
Apache • Servidor Web mais utilizado no mundo; • Gratuito e de código aberto; • Disponível para todas os sistemas operacionais; • Nativamente serve páginas estáticas; • Pode servir conteúdo dinâmico a partir de módulos (plugins) instalados.
mod_python • Módulo para execução de scripts python dentro do servidor web; • Os módulos funcionam associando padrões de URL a arquivos (no caso do python, scripts); • Instalação: • sudo apt-get libapache2-mod-python
Adicionando a aplicação ao Apache • Edite o arquivo httpd.conf: • sudo gedit /etc/apache2/http.conf • Adicione as seguintes linhas: <Location "/meusite/"> SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE meusite.settings PythonOption django.root /meusite PythonDebug On PythonPath "['/home/local/projetos'] + sys.path" </Location>
Adicionando os arquivos estáticos • Para que o módulo admin continue funcionando no Apache é necessário copiar os seus arquivos estáticos para o Apache; • Copie todos os arquivos da pasta: • django/contrib/admin/media • Para a pasta: • /var/www
Dicas • Quem se interessa pelo desenvolvimento em sistemas móveis, atenção ao Python S60; • Para utilizar é necessário baixar o Nokia S60 SDK; • Bibliotecar para gerar relatórios PDF em Python: PISA; • Os softwares Inkscape, GIMP, Blender e BrOffice são feitos, totalmente ou parcialmente, em Python e podem ser extendidos em Python através de plugins ou de macros; • O livro Python para Desenvolvedores é gratuito.

Python 08

  • 1.
    Curso de Python Aula8 - Tópicos Especiais Bruno Gama Catão brunogamacatao@gmail.com
  • 2.
    Agenda • Django +Adobe Flex; • PyGame; • Django + UOL PagSeguro; • Django + Apache; • Dicas.
  • 3.
    Django + AdobeFlex • Aplicações web são normalmente organizadas em 3 camadas: Apresentação Lógica Dados • Django acelera muito o desenvolvimento das camadas de lógica e de dados, mas não faz muito pela camada de apresentação.
  • 4.
    Camada de Apresentação Aplicações+ Web+ Baseadas+ RIA+ HTML5+ em+HTML+ Microso<+ Adobe+Flex+ Java+FX+ Siverlight+
  • 5.
    Adobe Flex • Motivação: • Cerca de 95% dos browsers têm o plugin do Flash instalado; • Desenvolvimento de aplicações web, para diferentes browsers, com HTML e CSS é difícil; • A tecnologia Adobe Flex produz aplicações web “bonitas” de forma mais produtiva.
  • 6.
    Arquitetura Layout MXML$ SWF$ Flex%SDK% (Flash)$ AS$ Lógica
  • 7.
    Ferramentas • Adobe Flex SDK: • Grátis; • Compilador (linha de comando) de arquivos MXML e AS para SWF; • Versões para Windows, Linux e Mac. • Adobe Flex Builder: • Editor visual integrado com o Eclipse; • Ferramenta paga: • Versão profissional: R$ 400,00 • Versão acadêmica: Grátis; • Versões para Windows e Mac.
  • 8.
    Integração de Flexcom Tecnologias de Servidor • Flex é uma tecnologia apenas para camada de apresentação; • O lado servidor da aplicação pode ser implementado com a tecnologia que preferir (Java, PHP, Python, Ruby, .NET, etc); • A comunicação pode ser feita: • WebServices (XML ou JSON); lento e genérico • Canais AMF. solução mais rápida e simples
  • 9.
    Antes de começar •LEMBREM-SE !!! • Abram o prompt de comando (terminal); • Configurem as variáveis de ambiente do seu computador: • No Windows (Linux não precisa): PATH=%PATH%;C:Python26;C:Python26scripts
  • 10.
    PyAMF • Implementação doprotocolo AMF para a linguagem de programação Python; • Instalação: • Setup tools: • easy_install pyamf prefira esta forma • Ou, download do site http://pyamf.org
  • 11.
    Instalando o Flex Builder • O Adobe Flex Builder vem de duas formas: • Plugin para o Eclipse; • Distribuição do Eclipse adaptada; • Para esta aula dispomos do Adobe Flex Builder Eclipse Plugin versão 3.0; • Atenção, este plugin apenas funciona na versão 3.4 (Ganymede) do Eclipse.
  • 12.
    Configurando Django + PyAmf • Dentro da sua aplicação crie um módulo chamado amfgateway; • Modifique o módulo urls principal, criando uma regra para o amf gateway.
  • 13.
    Módulo amfgateway import pyamf frompyamf.remoting.gateway.django import DjangoGateway import meuprojeto.aplicacao.views as views from meuprojeto.aplicacao import models services = { 'Servicos': views, } pyamf.register_package(models, 'meuprojeto.aplicacao.models') meuGateway = DjangoGateway(services, expose_request=False)
  • 14.
    Módulos urls urlpatterns =patterns('', ... (r'^gateway/', 'meuprojeto.aplicacao.amfgateway.meuGateway'), )
  • 15.
    E no ladoFlex ? <mx:RemoteObject id="servicos" endpoint="http://localhost:8000/gateway/" destination="Servicos"> ... </mx:RemoteObject>
  • 16.
  • 17.
    PyGame • Implementação dabiblioteca SDL para a linguagem de programação Python; • Permite a utilização de imagens, sons e dispositivos de entrada facilmente em programas Python.
  • 18.
  • 19.
  • 21.
  • 23.
  • 25.
    UOL PagSeguro • OPagSeguro é um componente que permite a sites receber pagamentos de diferentes fontes: • Cartões de crédito; • Boletos bancários.
  • 26.
    UOL PagSeguro • Funcionamento: • Você deve se cadastrar no PagSeguro: • http://www.pagseguro.com.br • Seu site deve enviar os dados para o PagSeguro com o seu número de cliente; • O PagSeguro irá intermediar todo o processo de pagamento; • Assim que o pagamento tenha sido confirmado, o PagSeguro irá notificar a sua aplicação.
  • 27.
  • 28.
    <form action='https://pagseguro.uol.com.br/security/webpagamentos/webpagto.aspx' method='POST'> <input type="hidden" name="email_cobranca" value="brunogamacatao@gmail.com"/> <input type="hidden" name="tipo" value="CP"/> <input type="hidden" name="moeda" value="BRL"/> <input type="hidden" name="ref_transacao" value="{{referenciaCompra}}"/> <input type="hidden" name="cliente_nome" value="{{nomeCompleto}}"/> <input type="hidden" name="cliente_cep" value="{{cep}}"/> <input type="hidden" name="cliente_end" value="{{endereco}}"/> <input type="hidden" name="cliente_num" value="{{numero}}"/> <input type="hidden" name="cliente_compl" value="{{complemento}}"/> <input type="hidden" name="cliente_bairro" value="{{bairro}}"/> <input type="hidden" name="cliente_cidade" value="{{cidade.nome}}"/> <input type="hidden" name="cliente_uf" value="{{estado.sigla}}"/> <input type="hidden" name="cliente_pais" value="BRA"/> <input type="hidden" name="cliente_ddd" value="{{telefone_ddd}}"/> <input type="hidden" name="cliente_tel" value="{{telefone}}"/> <input type="hidden" name="cliente_email" value="{{email}}"/> <input type="hidden" name="encoding" value="utf-8"/> {{for produto in produtos}} <input type="hidden" name="item_id_{{forloop.counter}}" value="{{produto.id}}"/> <input type="hidden" name="item_descr_{{forloop.counter}}" value="{{produto.titulo}}"/> <input type="hidden" name="item_quant_{{forloop.counter}}" value="{{produto.quantidade}}"/> <input type="hidden" name="item_valor_{{forloop.counter}}" value="{{produto.valor * 10)}"/> <input type="hidden" name="item_frete_{{forloop.counter}}" value="{{produto.valor_frete}}"/> <input type="hidden" name="item_peso_{{forloop.counter}}" value="{{produto.peso}}"/> {{end for}} </form>
  • 29.
  • 30.
    import sys import urllib2,urllib from django.http import HttpResponse     class Pagamento(object):   def _conectar(self, url, params): query_str = urllib.urlencode(params) req = urllib2.Request(url, query_str) f = urllib2.urlopen(req) conteudo = f.read() f.close() return conteudo   def _enviar(self, url, params): retorno = self._conectar(url, params) if retorno.lower() == 'verificado': return True else: return False   PS_URL = 'https://pagseguro.uol.com.br/Security/NPI/Default.aspx' class PagSeguro(Pagamento): def processar(self, token, params, url=PS_URL): if not params: return False else: lista = [] for key in params.keys(): lista.append((key,params[key])) lista.append(('Comando', 'validar')) lista.append(('Token', token))   return self._enviar(url, lista)
  • 31.
  • 32.
    def concluir(request): if request.method == 'POST': # token gerado no painel de controle do PagSeguro token = '12345699CA2AAAF4599EA697BB2F7FFF' p = PagSeguro() retorno = p.processar(token, request.POST)   if retorno == True: try: # Cadastra os dados recebidos no banco de dados. # Utilize o request.POST.get('nomedocampo') para obter os valores except: pass return HttpResponse('Ok') else: return HttpResponse('Error')   else: # Carrega tela contendo a mensagem de compra realizada return direct_to_template(request,'carrinho/concluir.html')
  • 33.
    Django + Apache •O servidor web integrado do Django deve ser utilizado apenas para desenvolvimento e testes; • Quando for implantar a sua aplicação em produção utilize o Apache.
  • 34.
    Apache • Servidor Webmais utilizado no mundo; • Gratuito e de código aberto; • Disponível para todas os sistemas operacionais; • Nativamente serve páginas estáticas; • Pode servir conteúdo dinâmico a partir de módulos (plugins) instalados.
  • 35.
    mod_python • Módulo paraexecução de scripts python dentro do servidor web; • Os módulos funcionam associando padrões de URL a arquivos (no caso do python, scripts); • Instalação: • sudo apt-get libapache2-mod-python
  • 36.
    Adicionando a aplicação ao Apache • Edite o arquivo httpd.conf: • sudo gedit /etc/apache2/http.conf • Adicione as seguintes linhas: <Location "/meusite/"> SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE meusite.settings PythonOption django.root /meusite PythonDebug On PythonPath "['/home/local/projetos'] + sys.path" </Location>
  • 37.
    Adicionando os arquivos estáticos • Para que o módulo admin continue funcionando no Apache é necessário copiar os seus arquivos estáticos para o Apache; • Copie todos os arquivos da pasta: • django/contrib/admin/media • Para a pasta: • /var/www
  • 38.
    Dicas • Quem seinteressa pelo desenvolvimento em sistemas móveis, atenção ao Python S60; • Para utilizar é necessário baixar o Nokia S60 SDK; • Bibliotecar para gerar relatórios PDF em Python: PISA; • Os softwares Inkscape, GIMP, Blender e BrOffice são feitos, totalmente ou parcialmente, em Python e podem ser extendidos em Python através de plugins ou de macros; • O livro Python para Desenvolvedores é gratuito.