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¶metro2=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))
_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' %}
{% 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!