terça-feira, 2 de setembro de 2014

Resumo das aulas 4 ~ 9

Olá! Como passaram? Bom, espero que bem, enfim, bora ao que interessa. Fiquei devendo da última vez a entrega da semana de 26/08 então estou fazendo esse post para repor a parte que estou devendo.
O post irá tratar das aulas 4 à 9. Vamo lá!

Aula 04 - Github e Deploy - App Engine e Python

Na vídeo-aula ele ensina como fazer um deploy (colocar o projeto no ar), e mostra como funciona o controle de versões do Git. 
Ele ensina como fazer o deplay pelo PyCharm indo no menu "Tools/Google App Engine/Upload Appengine App.." e depois selecionando o tipo de autenticação desejada (oauth2 ou Login com senha). Ou pelo terminal com o comando dentro da pasta appengine "appcfg.py update . " (sem aspas), sendo aquele ponto (.) indicando os arquivos que você gostariaa de atualizar, no caso, ele indica o diretório corrente.

Na aula ele fala sobre "rotas", paths e execução de funções para atender chamadas HTTP e o contrário.

O que uma "rota"? Rota é tudo aquilo que vem depois do seu domínio. Por exemplo: 127.0.0.1:8080/isso_eh_uma_rota, o "isso_eh_uma_rota" depois da barra é uma  rota, simples não?
O que acontece quando eu acesso a raiz? O teckton procura um arquivo chamado "home.py" e irá executar a rotina "index" existente no arquivo.
Como eu faço para criar uma rota? Crie uma pasta com o nome da rota desejada, um arquivo "home.py" e dentro dele crie a função  index.
Como eu faço para executar uma função dentro da minha rota? Após a rota digite "/nome_da_funcao."
Porque é interessante usar o router.to_path ao invés do redirect?  Pois se você refatorar o nome da função para um outro nome qualquer, o link que estava sendo usado no "redirect" vai se tornar um link quebrado. Para usar essa função, importe o pacote tecton e use a rotina router.to_path(nome_da_funcao), pois assim, caso você refatorar o nome da função a IDE consegue identificar os lugares que estão usando aquela função e irá evitar os links quebrados.


Na aula ele explica sobre a injeção de dependência "handler - _handler", "Response - _resp" e "Request - _req".

A injeção de dependência do teckton exige que você use esses objetos especiais como primeiros parâmetros, e para diferenciar o objeto do teckton dos outros, ele usa sempre o underline (_) no início do objeto. 

O método redirect do objeto "_handler" funciona da seguinte forma: ele manda uma resposta http 301 ou 302 dependendo do parâmetro que você passar para o redirect. E ele irá mandar essa resposta falando pra onde você deve ir pedindo o recurso para a função que você passou no router.to_path.

O objeto "_resp" é a resposta do HTTP, e tem várias coisas que podem ser usadas com ela, como por exemplo o status_code dando a resposta para o usuário, e ele também escreve no navegador.

O objeto _req que representa a requisição enviada do meu cliente. Ela possui algumas coisas como por exemplo, obter parâmetros através do método: "_req.get('nome_da_variavel')".

Para passar parâmetros você usa: nome_da_funcao?parametro1=AlgumaCoisa lembrando que a função precisa também precisa ter o parâmetro para enteder. Por exemplo:

def nome_da_funcao(_resp, _req, parametro1):
    parametro1=_req.get('parametro1')
    _resp.write('%s'%(parametro1))


Na aula ele mostra como receber mais de um parâmetro, ter um valor default,

Por convenção o teckton também consegue entender quando você está passando um parâmetro sem a necessidade do uso do "_req.get()", em uma string na URL: "nome_da_funcao?parametro1=valor" ele irá retornar na página: "valor valor 2 padrão". Pois o "valor 2 padrem dão" estava como padrão na minha função. Para passarmos mais de um parâmetro existem duas formas no teckton, usando Query String ou Restfull. Por exemplo: 
nome_da_funcao?parametro1=valor&parametro2=1 (Query String)
ou
nome_da_funcao/valor/1 (Restfull)

def nome_da_funcao(_resp, parametro1, parametro2='valor 2 pardrão'):
    parametro1=_req.get('parametro1')
    _resp.write('%s %s'%(parametro1, parametro2))

Na aula ele explica como funciona o TemplateResponse e TemplatePath.

Dentro da pasta "template" crie um arquivo HTML com o nome desejado... por exemplo: "exemplo.html". dento da função "index()" você precisa retornar um TemplateResponse() indicando o template que você quer renderizar, que no nosso caso é o "exemplo". então ficaria assim:

def index():
    return TemplateResponse(template_path='/exemplo.html')

Porém, existem algumas convenções que você pode adotar, que são:
1: Se você chamar o template com o mesmo nome da função e não informar o caminho no TemplateResponse ele irá procurar um arquivo html dentro de templates com o mesmo nome.
2: Crie uma pasta com o nome da função e coloque dentro dela o seu template chamando "home.html"


Na aula ele explica o que é o contexto, diz que o sistema de templates que está pré-configurado no Teckton é o Jinja2, configuração do pycharm, impressão de parâmetros do backend para o html.

O contexto é um dicionário, outras estruturas "mapa". Um contexto funciona assim:

contexto={'variavel1': valor1, 'variavel2': valor2}

para você passar o contexto para um template use:
def index(valor1, valor2):
    contexto={'variavel1': valor1, 'variavel2': valor2}
    return TemplateResponse(contexto)


Para configurar o PyCharm para que ele nos ajude na criação e manutenção dos templates vá em "File/settings". Busque por "template", no menu "Python Template Languages" no lado direito onde tem "template language" selecione "Jinja2" que é o padrão do Teckton. De um OK. E agora a IDE irá te ajudar com o auto-complete.

Para imprimir um valor do contexto criado anteriormente no HTML digite {{nome_variavel}}, então, no nosso caso, ficaria: {{variavel1}}. 
Em uma página simples então ficaria algo assim:
<!DOCTYPE html>
<html>
<head lang="en">
      <meta charset="UTF-8">
      <title></title>
</head>
<body>
<h1>{{variavel1}}</h1>

</body>
</html>


Explica como funciona a parte de herança de templates (como reaproveitar código dos templates) e os blocos.

Para você poder usar a herança entre HTMLs use a diretiva:
{% extends 'caminho/nome_da_pagina.html' %}

Blocos, são pedaços de código HTML que você quer substituir no na sua herança. usando a diretiva {% block nome_do_bloco %}
...algum conteúdo...
{% endblock%}

Agora, sabendo os dois, podemos aplica-los juntos, então, se você quer reaproveitar o código da página1, que está dentro da pasta header mas quer substituir o meio da página usamos:

{% extends 'header/pagina1.html' %}
{% block meio %}
...conteúdo do HTML a ser mudado aqui...
{% endblock%}

Macros são como os métodos de um objeto.

Para definir uma macro use:
{% macro nome_da_macro%}
...o que ela deve retornar...
{% endmacro %}

Para executar a macro use dentro do seu body  desejado e da herdando da página desejada:
{{nome_da_macro()}}

Então se essa macro está presente dentro da "pagna1.html" você irá precisar herdar a "pagina1.html" e escolher o body que você quer substituir. Se sua macro precisa de parâmetros, use {% nome_da_macro(parametro1, parametro2, parametroN) %}


If e For.

para usar um "If" no HTML use:

{% if variavel == 'valor' %}
...codigo...
{% elif variavel == 'ticaracati' %}
...mais codigo...
{% else %}
...e mais codigo...
{% endif %}

Digamos que você tenha uma classe Pessoa com nome e sobrenome. E você quer listar essas pessoas no seu html. Então para isso, você irá precisar usar o for! Para isso use:
<ul>
{% for p in pessoas %}
      <li>{{ p.nome }} - {{ p.sobrenome}} </li>
{% endfor %}
</ul>

App ou módulos, criação via linha de comando e criação de uma aba.

App é um módulo que procura ser uma mini aplicação no seu site que você pode usar até reutilizar entre sites.

Como criar uma app?
Passo 1: Entre no terminal/cmd
Passo 2 (Linux): Vá até a pasta do projeto e entre em /backend/venv.
Passo 2 (Windows): Vá até a pasta do projeto e entre em /backend/venv/Scripts
Passo 3: Digite "activate" para ativar o python referente a esse projeto. Se tudo der certo você deve ver um "(venv)" no começo das linhas seguintes.
Passo 4: Entre em /backend/appengine
Passo 5: Digite python manager.py app nome_da_aplicacao nome_da_tabela nome_do_campo1:tipo_do_campo nome_do_campo2:tipo_do_campo nome_do_campoN:tipo_do_campoN. Aperte "Enter".

Se ele deu certo, deve aparecer na pasta "apps, routes" do seu projeto uma pasta com o mesmo nome da app que você digitou logo depois do comando "manater.py app"

Para criar uma nova aba, entre em "base/base.html". copie a linha referente onde estiver o "tab=='COURSES'. Mas mudando o COURSE para o nome da app que você tinha digitado lah, porém no plural.



Bom... E é isso por hoje, um abraço!





segunda-feira, 1 de setembro de 2014

Resumo das aulas 11 ~ 13

Pois é... Cá estamos novamente com mais um feedback sobre a minha opinião a respeito do AppEngine.

Depois de muitas telas e telas de erro!! Agora que as coisas estão quase todas funcionando como deveriam, estou começando a gostar mais desse cara. De qualquer forma, vamos ao que interessa, irei falar hoje para você leitor o que entendi sobre as aulas gratuitas do Professor Renzo que estão no Youtube falando sobre login com Google, facebook, passwordless, e um pouco de segurança usando o framework abordado na aula. Enfim.,.. bora!

Se você tiver interesse em as aulas o link é esse:
https://www.youtube.com/watch?v=lTnA1G25LRU&list=PLA05yVJtRWYRGIeBxag8uT-3ftcMVT5oF&index=19


Aula 11 - Login com Google - App Engine e Python

Se todos os o passos anteriores ocorreram como deveriam, você só irá precisar ter a conta do google. A framework do teckton faz todo o resto para você! mto simples, e legal, vlw!

A segunda aula, irá ensinar como fazer o login sem senha usando um tocken gerado a partir de um site, que no caso é o: pswdless.appspot.com. também da autoria do professor Renzo. Agora, com os vamos aos passos.
Passo 1: coloque seu email no campo "Type your email", o site irá te enviar um email te dando uma URL de acesso, clique nela.
Passo 2: Na página que a URL te redirecionou, clique em "My Sites", e lá você diz quais os sites que você quer acessar sem precisar de senha, ele irá gerar um ID e um Token.
Passo 3: Logado como administrador na sua aplicação entre em "{seu dominio}.appspot.com/permission/admin". e marque o usuário desejado como administrador, e em seguida faça logout.
Passo 4: Vá até a tela de login (.appspot.com/permission/login)
Passo 5: Digite o seu email no campo "Email", E se tudo deu certo (não foi o meu caso... mas ok), o passwordless irá te enviar um email e você irá te enviar um email, permitindo o seu login.

A terceira aula, mostra como fazer login com facebook.

Passo 1: Tenha uma conta no facebook.
Passo 2: Entre em "developers.facebook.com/" clique no item dentro da aba "Apps", aceite os termos do facebook para poder usar seus serviços.
Passo 3: Clique em "Create new app", de um nome para ela, de uma categoria, e clique em Create App.
Passo 4: No menu a esquerda clique em "settings", clique em seguida em "Add Plataform"
Passo 5: Clique em "WebSite"ro
Passo 6: No campo que apareceu chamado "Site URL" informe a URL do seu site, e no campo App Domain digite o nome do seu site sem http/https. Salve as alterações!
Passo 7: Entre como administrador no {seu dominio}/login/facebook/form e infome nos campos o ID dado pelo facebook para a sua App (no facebook estará como App ID), e o token, que no facebook estará como App Secret, sendo necessário você clicar em "Show" para que ele mostre o token. Salve as alterações e faça logout
Passo 8: Entre novamente na tela de login e clique no botão do facebook, aceite logar com o mesmo, e fim.

A aula mostra que o teckton usa o conceito de caixa branca, que é: "tudo estará protegido ao menos que você diga explicitamente diga o contrário". E mostra como se proteger de ataques chamados "Cross Site Request Forgery", na aula ele mostra que existem horas que você precisa usar o método post (como passagem de senhas por exemplo). Mostra que o alguém má intencionado pode colocar parte da sua URL em uma imagem por exemplo na tag "src" fazendo uma chamada no seu método get. Se você estiver por exemplo com permissão de administrador, ele irá conseguir ter esse acesso sussa! E é aí que o teckton entra, gerando um tocken de acesso randômico. 

A aula mostra a questão das permissões de usuário e grupos de usuário, Mostra como definir novos grupos, colocar uma página sem a necessidade de estar logado, e também o contrário. Tmabém mostra a tabela de segurança de paths "/permission" onde ele mostra todos os recursos do seu site, e qual o tipo de segurança está sendo aplicada e se ele está seguro ou não.

A aula mostra para que serve o decorator "login_required", acessando através de um template e no código python.
Basicamente ele mostrou a injeção de dependência para pegar o usuário logado com "_logged_user", e assim você consegue acessa-lo, e seus atributos também.


Bom, vou ficando por aqui, até a próxima, e um abraço :)

quarta-feira, 6 de agosto de 2014

Atividade da semana 1: 

  1. Criar uma conta do Github;
  2. Criar um reposítório;
  3. Escrever algo no Readme;
  4. Fazer um push;
  5. Enviar link do repositório para o fórum da turma.
Atividades da semana 2: "Explicar o que entenderam dos vídeos e responder, em suas palavras, os questionários dos 3 primeiros capítulos do livro: 
App Engine, Você programa e o Google Escala!"

Os vídeos estão interessantes, bem explicados, apesar de ter me dado algumas dores de cabeça na hora de configurar o ambiente usando o Linux Mint. Como sugestão acho que o arquivo .sh, poderia conter uma verificação (e caso não exista, fazer uma instalação) para saber se os arquivos do python necessários para que a execução do Teckton seja concluída com sucesso.

Respostas do livro: "App Engine, Você programa e o Google Escala!"
Capítulo 1:
1. Quais as duas principais versões atuais do interpretador Python?
R: 2.7 e 3.4 (ref. pag 1)

R: Apenas a versão 2.7, mas sempre que possível trabalhar com a versão mais recente do python, isso é recomendado devido as melhorias

R: POis o SDK do APp Engine provê as ferramentas necessárias para a execução do servidor localmente, interação com banco de dados, entre outras funcionalidades.

R: Você não precisará ficar acessando o diretório todo o momento, você terá um "atalho" criado no SO, podendo acessar os arquivos daquele diretório dentro de qualquer outro diretório.

R: IDE é uma ferramenta de desenvolvimento que facilita (ou ao menos é o que ela deveria fazer), a vida. Te provendo funcionalidades que muitas vezes seriam trabalhosas ou chatas de se fazer sem as mesmas, como debug, auto-complete, cores nos textos e afins.

R:  app.yaml

R: o endereço padrão que fica dentr odo app.yaml é: "new-project-template" (sem aspas), mas o domínio padrão é "http://<seu identificador>.appspot.com"

Capítulo 2:
1. Qual o nome do arquivo de configuração do Google App Engine? 
R: app.yaml

2. Para que serve o item application do arquivo de configuração? 
R:  Ele conta o identificador da aplicação. E deve ser o mesmo utilizado na criação da aplicação no console do GAE, para que o SDK consiga entender isso e publicar corretamente na nuvem.

3. Para que serve o item version do arquivo de configuração? 
R: É a versão do site que estará no servidor, se você por exemplo quiser testar uma versão antes de colocala em produção, você pode. Mas caso precise retroceder para uma anterior é só marca-la como default.

4. Qual endereço deve ser utilizado para acessar uma aplicação com id foo e versão 35?
R: http://35.foo.appspot.com

5. Para que serve a seção libraries do arquivo de configuração?
R: Ele informa o nome da biblioteca a ser instalada e opcionalmente a sua versão.

6. Para que serve a seção handlers do arquivo de configuração?
R: Ele define o início do roteamento.

7. Como são definidos os paths mapeados no arquivo de configuração?
R: com o comando: "url: .*". Onde "*" é uma expressão regular que significa "qualquer cadeia de caracteres".

8. Por que é necessário mapear RequestHandlers nos scripts Python?
R:  É muito comum em Python termos várias classes declaradas em um módulo. Sendo assim, apenas acrescentar o script no arquivo de configuração não é o suficiente para saber qual handler deve ser executado.

9. Para que serve a classe RequestHandler? 
R: Para construir uma janela que deseja tratar requisições

10. Como se relacionam os métodos da classe RequestHandler e os do protocolo HTTP?
R: Os métodos da classe RequestHandler devem ser sobrescritos para processar as chamadas HTTP de tipo com mesmo nome. Por exemplo, uma chamada HTTP do tipo GET será processada no método sobrescrito get, Uma chamada do tipo POST em um método post e assim or diante. (sim, eu copiei a resposta do livro pois não entendi como colocar a resposta aqui através do livro..)

11. Para que serve o objeto Request ?

R: ele consegue acessar as informações passadas por HTTP

12. Como se obtém os valores de parâmetros enviados via query string em uma chamada HTTP do tipo GET?
R: % variavel
13. Para que serve o objeto Response?
R: pois é através dessa interface que o servidor obtem acesso as informações e parâmetros enviados pelo usuário.
14. Qual o método do objeto Response serve para enviar strings?
R: o parâmetro "?" seguido do nome do variavel, um sinal de igual (=) e o valor da variável.

15. Como é possível enviar uma resposta para redirecionamento?
R: redirect(str("alguma string"))


Capítulo 3

1. Para que serve o Virtualenv?
R: Ele permite que se crie um ambiente isolado para cada projeto. Definindo a linguagem e qual linguagem será usada em cada projeto.

2. Qual a função do arquivo convention.py?
R: a ideia geral é a não necessidade de mapear handlers manualmente.

3. Por que é necessário incluir bibliotecas através de código no arquivo convention.py?
R:

4. Como ficaria a declaração de u
ma função para tratar a execução de chamada no path
/usuario/salvar?nome=Renzo&idade=31?
R: def salvar(nome, idade):
    #...tratamento

5. Como se diferenciam parâmetros recebidos por injeção de dependência dos recebidos via
requisição HTTP?
R: os parâmetros recebidos por injeção de dependência recebem um parâmetro a mais "_req"

6. Qual deve ser a posição de parâmetros recebidos via injeção de dependência?
R: eles devem ser os primeiros parâmetros da função. 

7. Qual deve ser o parâmetro declarado quando for necessário fazer um redirecionamento?
R: _handler


8. Qual o script e função devem ser utilizados para se calcular paths com base em uma função?
R: o script a ser usado é esse: variavel = router.to_path(funcao, 'diretorio', 'handle')
Pois a intenção dessa abordagem é que se por ventura o nome da função for alterado, a IDE irá continuar rodando, ou ao menos, te avisar na hora da compilação que a função não existe.