0% acharam este documento útil (0 voto)
61 visualizações

Notebook Py

Python é uma linguagem de programação de alto nível, fortemente tipada e interpretada que pode ser usada para desenvolvimento web, desktop e ciência de dados. O documento lista algumas bibliotecas populares para cada área e explica conceitos básicos de Python como variáveis, tipos de dados, operadores e estruturas de decisão e repetição.

Enviado por

Bruno Alves
Direitos autorais
© © All Rights Reserved
Formatos disponíveis
Baixe no formato DOCX, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
61 visualizações

Notebook Py

Python é uma linguagem de programação de alto nível, fortemente tipada e interpretada que pode ser usada para desenvolvimento web, desktop e ciência de dados. O documento lista algumas bibliotecas populares para cada área e explica conceitos básicos de Python como variáveis, tipos de dados, operadores e estruturas de decisão e repetição.

Enviado por

Bruno Alves
Direitos autorais
© © All Rights Reserved
Formatos disponíveis
Baixe no formato DOCX, PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 33

Python

Python é uma linguagem de programação de alto nível, fortemente tipada. É


uma linguagem de script, orientada a objetos e interpretada.

Algumas Libs

Desenvolvimento Web

Django

Flask

Pyramid

PyQL - GraphQL

Desenvolvimento Desktop

Tkinter

Pyqt – Base do KDE

Kivy

Data Sience

Scipy

Pandas

Ipython

Python basíco

Variáveis – Python reconhece o tipo de variável automaticamente, porém


pode se trocar o tipo de forma manual.

# → é usado para fazer comentarios nos codígos

\n → é usado como um enter, para ir para a outra linha

Tipos de Variaveis
str →String, Uma cadeia de caracteres(“Texto”)
int → Numero inteiro(20,35)
float → Numero com ponto Flutuante{numero com casa decimal} (1.5, 8.9) » Se usa
ponto final no lugar da virgula por conta do padrão americano.

Complex → numeros complexos (50+32j)


bool → Valor Boleano {Ou Logico} (True, False)

Comentários são feitos utilizando #

strings dinâmicas
Podemos deixar uma string dinâmicas inserindo diferentes tipos de variáveis.

o símbolo para a composição é o %

para cada tipo de dado há uma letra especifica

d - inteiros
s - strings
f - float

para utilizarmos seguimos a ordem %s

para usar a string dinâmica com float seguimos a ordem %.(numero de casa
depois da virgula)f

Operadores aritméticos
Operação Resultado

X+Y Soma de X e Y

X-Y Subtração de X e Y

X*Y Multiplicação de X e Y

X/Y Divisão de X e Y (Float)

X // Y Divisão de X e Y (Int)

X%Y Restante da divisão de X e Y (X/Y)

X ** Y x elevado a Y

-X X negado
+X X intalterado

Operadores de comparação
Operação Significado

< Estritamente menor que

<= menor ou igual que

> Estritamente maior que

>= Maior ou igual que

= Atribuição

== Igual a

!= Não é igual a

is identidade do objeto (é)

is not Identidade do objeto negada (Não é)

operadores lógicos
And → Verifica se as declarações em análise são verdadeiras
Or → verifica se ao menos uma das declarações são verdadeiras
Not → Leva ao oposto da declaração dada
Operação Resultado

X or Y Se X é falso então Y, do contrário X

X and Y Se X é falso então X, do contrário Y

Not x Se X é falso então True, caso contrário False

Valor Boleano
True → Verdadeiro*
False → Falso*
none → Nulo*
*Precisa ter a primeira letra maiúscula para ser reconhecido
0 → zero

Funções built in
Função o que faz
Print() Imprime o que está entre parênteses no terminal.

Type() Mostra o tipo da variável inserida

str() Transforma a variavel em string

int() Transforma a variavel em inteiro

float() Transforma a variaverl em ponto flutuante

list() Transforma em lista

tuple() transforma em tupla

.format() Concatena o valor com a variável

input() Adiciona informações por parte do usuario.

enumerate() Adiciona o indice numerico a algo

range() Retorna uma serie numerica no intervalo nomeado

len() usada para retornar a quantidade de letras(ou itens de uma lista)

sum() Função somar

max() Maior valor

min() Menor valor

abs(X) Valor Absoluto ou magnitude de X

Complex(Re, Im) Um numero complexo com parte real e parte imaginária

C.conjugate() conjugado do número complexo C

divmod(X, Y) o par ( X // Y, X % Y)

pow (X, Y) X elevado a Y


return() Retorna um valor não visualiza a saída, apenas salva ela

Round(x,y) Retorna o float do argumento, x » numero para ser arredondado, y


» quantidade de dígitos depois da virgula.

callable(objeto) verifica se um objeto pode ser chamado

list([]) Transforma em lista

slice(start,stop[step]) Corta o elemento devolvendo o valor inicial, aonde parar e


quantas casa

tuple() Transforma em tupla

.strip() Retira os espaços


.lower() Deixa tudo minúsculo

.upper() Deixa tudo Maiúscula

.capitalize Deixa a primeira letra maiúscula

Funções de Lista

.append() adiciona novos valores ao final da lista

.pop() Remove a última posição ou

.insert( posi,valor) adiciona um elemento na posição desejada

.remove(posição) Remove o valor de uma posição específica

.sort() Ordena a lista

.reverse() ordena a lista do contrário


continue → continua um laço while
break → Para o laço de repetição

Funções de listas


.insert(n) → insere um numero na posição n
.remove(n) → remove um elemento especifico
.sort() → ordena a lista
.sort(Reverse = True) → Orderna a lista de forma contraria
.index() → Retorna a posição de um elemento da lista

Funções deTuplas
.split() → Separa os valores

Estrutura de decisão (IF)


Ela examina uma ou mais condições e verificando se são verdadeiras ou falsas, e retorna
algum retorno dependendo da verificação.
o Elif serve para verificar se duas ou mais condições são verdadeiras. pode se ter quantos
elif quiser dentro do código.
o if termina quando a indentação acaba

ex:
if condição1:
resultado se condição1 verdadeiro
elif condição:
resultado se condição2 for verdadeira
else:
resultado se as duas condições forem falsas

se Se verdadeiro
falso condi
ção

codi
codig go
condi se
o se
ção True
True
elif

codig
o se
False

Estruturas de repetição → Interação

interação é a capacidade de executar um código repetidas vezes.

Laço for
Usado para percorrer sequências previamente conhecidas.
ex:
lista = [1,2,3]
for item in lista
print item
resultado » 1,2,3

Laço while
Usado para percorrer sequências a partir de uma condição
ex:
count = 0
while count <=5
print (count)
count +=1
if count >3: break

Listas
Lista são um tipo de sequência de dados
uma lista sempre é representada por [ ]
ex:
[0,1,2,3,4]
para se acessar um elemento da lista se usa: nome_da_lista[Indice do elemento]
Para buscarmos um numero de trás para frente colocamos o negativo antes do numero,
deste modo se usa a partir do -1

subistituição:
Nome_da_lista[elemento] = novo argumento

deletando
Del nome_da_lista[elemento]

para usar as funções das Lista usamos o append mode, uma sintaxe para chamar os metódos nativos
do python
operador ponto . →Chama um certo metodo
ex:
objeto.metodo()
slicing → Fatiamento
nome_da_lista[1:2]
1→O primeiro valor da lista
2→uma posição acima da última que precisamos

Lista com varias listas


nome_lista[lista1, lista2,lista3]

tupla
uma Tupla sempre é representada por ()
ex:
(0,1,2,3,4)

Tuplas são imutáveis, os valores dentro delas não podem ser alterados ou excluídos

Valores separados por virgula em string


(age, Year_of_school) = “30,17”.split(“,”)
age = 30
y_o_s = 17

Esse método chama-se atribuição de tupla

dicionários
um dicionário sempre é representado {}
ex: {a1:b, a2:c} → Par chave-valor
adicionar novo valor
dict[nova chave] = novo valor

substituindo valor
dict[chave existente] = novo valor

podemos usar Listas dentro de dicionarios, podemos também gerar dicionarios e adicionar
valores em seguida

dict.get()→ Retorna o valor selecionado, caso ele não existir ele irá responder none

Criando Listas Com Range


range(start, stop, step)
Cria uma lista de números com intervalos
start→O primeiro elemento da lista (2° na ordem de importância)
stop→ o último valor +1 (1° na ordem de importância)
step→ a distância a cada dois valores consecutivos (3° na ordem de importância)

Funções
Para definir uma função é usada a palavra reservada Def
def nome_da_funcao(paramentro):
código da função
quando vamos chamar a função colocamos um argumento
nome_da_funcao(argumento)

a função return só pode ser usada uma vez na função

função recursiva é quando uma função chama a si mesmo várias vezes. ela tem algumas
situações de uso mas quase nunca é usada (tem que tomar cuidado para não criar um loop
infinito)

Funções com parâmetros obrigatórios e opcionais.

Nesse caso os parâmetros não independem do outro, mas o parâmetro opcional deve estar
sempre depois dos obrigatórios:

def soma_numeros(a,b,c=10):
print(a+b+c)
Se você passar o parâmetro c ele irá substituir o valor, caso não passe será aquele
parâmetro obrigatório.

Função como parâmetro

podemos inserir funções dentro de funções como parâmetros de outras funções


def operação(a,b, f):
resultado = f(a,b)
return resultado

o f no final dos parâmetros representa a função a ser passada.

sequências de parâmetros

podemos criar uma série de parâmetros na hora de criar uma função, se forem do mesmo
tipo podem ajudar a criar uma função que processa diversos parâmetros.

def funcao(*argumentos):
for x in argumentos:
print(x)

função Lambda
A função lambda surge da programação funcional, podemos criar uma função que executa
uma simples expressão e atribui o valor a uma variável.

x = lambda a:a+10
print(x(10))

Programação orientada a Objetos

Os objetos interagem entre si, cada objeto tem características conhecidas como
propriedades e ações conhecidas como métodos.

Objeto → Todo valor em python é um objeto

Classes

As classes são moldes de objetos. iremos criar uma classe que pode orioginar diversos
objetos. Cada classe é originada pela palavra Class. podemos adicionar propriedades e
métodos a uma classes que serão utilizadas por seus objetos.
Sempre a primeira letra do nome da Classe e Maiúscula.

objetos

Um objeto é um “filho” de uma classe


ele poderá utilizar as propriedades e métodos que foram definidas na classe pai,
Após sua criação o objeto é independente da classe, podendo alterar as propriedades
isoladamente.

métodos

métodos são Funções Criadas para um objeto


Que pode interagir com o próprio objeto ou outros, a palavra reservada self se trata do
próprio objeto
iniciamos os métodos com a palavra def

Herança

Herança é um conceito de Orientação a Objetos.


onde uma classe herda as propriedades e métodos de outra. Assim seus objetos herdarão
também estas características.
A classe que vai herdar deve receber como parâmetro a classe pai.

Substituição de método

É possível substituir facilmente um método herdado, apenas precisamos declarar ele


novamente na classe filha, e então o método da classe filha é o que vale para seus objetos,
desse modo podemos utilizar somente os métodos especificados.

métodos mágicos

Há muitos métodos mágicos, um destes métodos é o __str__. Ele serve para imprimir uma
representação de String do que desejamos, podemos inserir este método dentro de uma
classe

Propriedades constantes

Podemos também definir propriedades que não variam de objeto em objeto, ou seja, elas
iniciam com um valor fixo.
para isso basta declarar fora de self com algum valor

encapsulamento

Encapsular é um outro recurso da POO, o objetivo é criar atributos privados, que não
podem ser alterados. para fazer isso devemos usamos _ ou __ na frente dos métodos ou
variáveis.

Deletando objetos

A instrução del é útil em python. Podemos Deletar objetos por meio de del obj.
após interpretada a linha no código, não podemos mais acessar nem propriedades e nem
métodos de objetos removidos.

Objetos Lógicos
Se refere a interação de um ou mais objetos

objeto = Dados+Manipulação de operações


Classes → Define as regras para criar estes objetos
Atributos → Refere-se ao estado do objeto
Método → Resultado de uma sequência lógica que pode ser aplicada ao objeto

é importante definir o tipo de dado do objeto


classe “List”
objeto : [159,160,1578]

Atributos : Tipo de dados Int


Método .extend() / .index()

Função vs. Método


Função Método

Podem ter vários parâmetros o Objeto é um desses parâmetros

Existe por conta própria pertence a uma certa classe

Função() objeto.método()

Manipulação de String

Convertendo Strings em lista

As Strings em python podem ser facilmente convertidas em lista.


a Função list transforma uma string em lista, já a função join transforma uma lista em uma
string.

Verificação de String
podemos verificar as palavras do início e do fim de uma string.
o ḿetodo startswith verifica se uma string começa com uma determinada palavra, já o
método endswith verifica se a string termina com a palavra.

Conversão de String
Podemos converter uma string para Maiúscula ou minúscula.
a função lower converte todas as letras para minúsculas e a função Upper converte todas
as letras para maiúsculuas

Pesquisando palavras
Podemos pesquisar palavras em uma string, o operador in que torna a tarefa mais fácil, há
também o operador not in que é o inverso do in.
“teste” in frase

Número de ocorrências
Podemos contar o número de ocorrências de uma determinada string em outra, usamos a
função count, ela retorna o número de palavras encontradas.
Busca em string
Uma forma de achar palavras em string é a função find, a resposta será o índice da primeira
letra da ocorrência. Caso a palavra não seja encontra iremos receber -1

separando string em lista


Usando a função split é possível criar uma lista, cada item será definido por um separador
comum e o operador deve ser passado como argumento.

substituição

A função replace nos permite substituir algo em uma string, se a palavra se repetir ela será
substituída em todas as repetições, porém pode ser evitado se colocarmos um parâmetro
que limita as substituições.

verificando se uma string é número


com pyhton podemos verificar se uma string é composta por números, para isso usamos o
método isdigit. nesse caso se a string conter só números obteremos True, caso tenha mais
que números recebemos False

Arrays

Array são estruturas de dados. Elas só trabalha com um dados de um tipo.

Numpy array de N dimensões = ndarray


uma ndarray é sempre homogênea

array() → Retorna uma estrutura de dados no formato de Array numpy


a.shape → indica a quantidade de linhas e colunas

para puxar um valor dentro do array deve-se colocar o valor da linha e da coluna

vetor → objeto que possue magnitude e direção (1darray = vetor)


matriz → representação bidimensional de dados (2darray = Matriz)

Bibliotecas padrões

Módulo → é um código pré-escrito contendo variáveis funções e classes


Biblioteca (lib) → é uma coleção de módulos relacionados.

como usar bibliotecas

import biblioteca → importa todo o módulo


import biblioteca as novo_nome → importa todo o módulo com um novo nome
from biblioteca import função → importa somente as funções solicitadas
from biblioteca import função as novo_nome → importa a função solicitada com um novo nome

Math → Lib de Funções matemáticas


math.sqrt → calcula a Raiz Quadrada
random → Gera números aleatórios
random.random() → gera um float aleatório no intervalo de [0:1]
random.randit() → randomiza em um intervalo fornecido e fornece um valor inteiro.
Stats models → Estatística descritiva. gráficos e regressões

(Usado em Data science)


Numpy → Lib que permite trabalhar com Array multidimensionais
Pandas → Lib que Permite organizar os dados de forma tabular e anexar rótulos descritivos as linhas e
colunas
Matplotlib → uma Lib de graficos 2d especialmente projetadas para cálculos da numpy

Algoritmos

Algoritmos são sequências de instruções que têm como objetivo a resolução de algum
problema. Estas instruções geralmente recebem uma massa de dados, executam algum
tipo de processamento sob essa massa e devolvem o resultado deste processamento. É
importante salientar que os algoritmos possuem um início, um meio e um fim: todo
algoritmo, em algum momento do tempo, precisa ser concluído.

Arrays
Os arrays constituem uma das estruturas de conjuntos mais básicas. Trata-se na verdade
de um espaço de memória geralmente contínuo e segmentado, onde cada posição de
memória originada da segmentação pode ser utilizada para armazenar um elemento.

Existem alguns pontos que você sempre tem que ter em mente quando estivermos falando
de arrays:

● Geralmente, armazenam o mesmo tipo de dado em todas as segmentações;


● Possuem um tamanho pré-determinado;
● As posições são acessíveis através de um índice numérico que começa em 0. Isso
quer dizer que o primeiro elemento estará na posição 0, o segundo elemento na
posição 1, e assim por diante.

Busca Linear

É um algoritmo que irá varrer todo o vetor em busca de um determinado valor.


irá buscar de forma linear, do começo ao fim
Selection sort

Ele busca ordenar os vetores em ordem crescente

Busca Binária
Esse algoritmo divide o array em duas partes e verifica se o número é maior ou menor do
que o procurado

Mensurando eficiência de um algoritmo

Existem diferentes algoritmos para ordenação e para pesquisa, cada qual com seu
funcionamento interno e com sua “filosofia”. Mas é fato que um determinado algoritmo pode
ser mais eficiente em detrimento dos demais... Como podemos realizar esta análise é
determinar o melhor algoritmo para cada situação?

É importante ressaltar que nós temos dois tipos de análise que podem ser realizadas no
que diz respeito à eficiência de um algoritmo:

● Análise temporal: diz respeito ao tempo que um algoritmo leva para ser completado;
● Análise espacial: diz respeito, principalmente, à quantidade de memória que um
algoritmo consome para ser completado.

É importante citar que estas análises não são, por muitas vezes, quantitativas, e sim
qualitativas. Geralmente, o algoritmo que é executado mais rápido é o mais eficiente. Mas
existem algoritmos que são muito rápidos e consomem muita memória. Em uma máquina
com disponibilidade de memória, isso não é um problema, mas em máquinas onde isso é
um fator limitante, pode ser que um algoritmo não seja considerado o mais eficiente. Esta
análise não deve levar em consideração somente os números: ela deve levar em
consideração também os fatores externos.

Prevendo comportamento de um algoritmo

Existe um outro grande desafio quando falamos de análise algorítmica: como prever como
um algoritmo vai se comportar, temporal e espacialmente falando, com a variação da massa
de dados de entrada, por exemplo? Como vou saber a variação temporal e espacial para
um algoritmo que tenha 1000 entradas ou 1000000000 de entradas?

Essa previsão é praticamente impossível de ser feita de maneira completamente assertiva,


mas é possível chegar a aproximações de qualidade utilizando modelos previamente
estabelecidos. Estes modelos acabam sendo representados por funções matemáticas,
funções estas que visam justamente mostrar a variação temporal e espacial de acordo com
um determinado número de entradas. Por muitas vezes, essas funções são representadas
com uma notação especial, notação esta chamada “notação assintótica”.

Análise Assintótica
A análise irá definir três casos:
O melhor caso, o pior caso e por último o caso médio.

Big-O
Sempre determina um modelo pelo seu pior caso.

Estruturas de Dados

Uma estrutura de dados é uma maneira de armazenar e relacionar conjuntos de


informações. Imagine, por exemplo, que você precise guardar a lista com o nome de seus
amigos. Para armazenar estes dados de maneira integrada e em conjunto (afinal, estamos
falando de uma lista), precisamos dispor estes dados de maneira “amarrada” uns aos
outros. Para “amarrar” estes dados na memória e os armazenar como um conjunto
propriamente dito, nós precisamos dispor estas informações em determinadas estruturas
que repliquem este comportamento de conjunto. Essa parece ser uma tarefa trivial, mas não
é: além de termos que dispor os elementos de maneira “amarrada” na memória, temos que
cuidar para que operações de inserção e exclusão não deturpem a disposição dos
elementos dentro da memória, descaracterizando o conjunto. A estas estruturas que nos
permitem fazer essa amarração das informações, nós damos o nome de estruturas de
dados.

Existem várias implementações de estruturas de dados diferentes. Cada uma destas


estruturas é mais adequada para determinadas situações: algumas são boas para
“varremos” as informações em seu interior, mas são lentas para se fazer a inclusão e/ou
remoção de informações; outras apresentam o caminho inverso, sendo lentas para a
varredura, mas eficientes para a inserção/remoção de informações. Por isso, é de suma
importância que saibamos como cada estrutura funciona internamente e saibamos seus
pontos fortes e fracos: a simples utilização correta de uma estrutura de dados dentro de um
contexto, pode fazer com que a performance e a manutenibilidade do software sejam
melhorados.

Arrays

Os arrays constituem uma das estruturas de dados mais básicas. Trata-se na verdade de
um espaço de memória geralmente contínuo e segmentado, onde cada posição de memória
originada da segmentação pode ser utilizada para armazenar um elemento.

Existem alguns pontos que você sempre tem que ter em mente quando estivermos falando
de arrays:

● Geralmente, armazenam o mesmo tipo de dado em todas as segmentações;


● Possuem um tamanho pré-determinado;
● As posições são acessíveis através de um índice numérico que começa em 0. Isso
quer dizer que o primeiro elemento estará na posição 0, o segundo elemento na
posição 1, e assim por diante;
● Não oferecem operações como inserção e remoção de elementos.

Estamos falando de arrays nesse momento porque é muito comum que array seja utilizado
como sinônimo de vetor. E eles são muito similares, inclusive, o que até nos permite
utilizarmos como sinônimos: ambos são indexados (os elementos são acessados através de
um índice), ambos geralmente guardam o mesmo tipo de dados em todas as posições,
ambos possuem o índice inicial como sendo 0... No mercado de trabalho, certamente, você
verá estas estruturas sendo utilizadas como sinônimos. Porém, é importante sabermos que
existem algumas diferenças entre os conceitos de vetor e array:

● Vetores permitem as operações de adição de elementos na última posição vazia ou


em uma posição específica, além de permitirem a remoção de elementos;
● Vetores podem ter seu tamanho expandido caso necessário, embora isso seja
geralmente muito custoso.

Para que estas situações fiquem mais aparentes em nosso estudo, vamos começar a criar a
nossa implementação de um vetor baseado em um array.

Tipos de Dados da lib Array

Type Code Python type size in bytes

‘b’ int 1

‘u’ String 2

‘i’ int 2

‘l’ int 4

‘f’ float 4

‘d’ float 8

Python para finanças


Pandas

Importando Dados de acções no pandas.

panda.series() → uma unica coluna de dados


panda.dataframe() → Varias Colunas
From Pandas_datareader import data as wb
wb.datareader (Sigla da nomeação, datasource = nome da fonte de dados, start= ano-mês-
dia)

info() → puxa as informações das ações, Consegue visualizar a classe, o período, colunas e os valores
em cada coluna juntamente com o tipo de dados
head() → puxa as informações iniciais do dataframe
tail() → puxa as informações finais do dataframe
{no head e no tail podem ser passado a quantidade de linhas que deseja como parâmetro}

quandl

variavel = quandl.get(argumento)
Puxa os valores do argumento fornecido.

Transformando arquivo em csv

variável.to_csv(“caminho_do_arquivo.extensão”) → salvar o arquivo em csv


variável = pd.reader_excel (“caminho.xlsx”) → Le o arquivo em padrão excel
variável = pd.reader_csv(“caminho.csv”) → le o arquivo em padrão csv
varivale = pd.reader_csv(“caminho.csv”, index_col = “date”) → puxa somente a coluna que pedimos
no index.
variável.set_index(“coluna desejada”) → exibe somente os dados com o índice que você solicitou

pyhton tem um índice padrão, ou seja ele atribuiu um valor em cada linha dos seus dados
que começa a partir do zero.

REST API com Flask

Sobre WEB

HTTP → Hypertext transfer protocol (protocolo de transferência de hipertexto)


HTML → Hypertext markup language (linguagem de marcação de hipertexto)

URI → Uniform resource identifier ( identificador uniforme de recursos)

Métodos
GET → Ler
POST → Inserir / Postar
PUT → Alterar / Atualizar
DELETE → Remover

Quando clicamos em um link estamos chamando o método GET do HTTP.


Quando enviamos um formulário estamos chamando o método POST

Exemplo de URI
reservahotel.com/hotellookup.do?cities=rio-de-janeiro
(URI Baseado em ação)
hotellookup →pesquisar hotéis
do → executar
? → query ou consulta
cities → Parâmetro chamado cidades

com uma API


reservarhotel.com/hoteis?cities=rio-de-janeiro
URI com um único recurso chama-se instancia
URI com vários recursos chama-se collection.
Limit → Não será exibido mais do que a quantidade estabelecida pelo parâmetro, possivelmente
menos
offset → quantidade de elementos que serão pulados de forma que só aparecerão resultados
posteriores ao valor do offset

uma coleção deve conter nomes no substantivo e no plural

CRUD HTTP

Create → Criar POST → Criar

Read → Ler GET → Ler

Update → Alterar PUT → Alterar

Delet → Remover DELETE → Remover

Autenticação de usuários

REST API’s São Stateless (Sem estados)

Usamos o basic auth (Basic acess authenticator)


Vantagens →Simples, Servidor stateless, suportado por todos os browsers
Desvantagens → HTTPS apenas, sujeito a ataues, deslogar é complicado

Soluções melhores
Digest acess authentication
asymetric cryptography
oauth
Json web token

Para aplicação de REST api com Flask usaremos o Json web token

Criando um Ambiente Virtual


Criar uma pasta para armazenar o virtual env.
virtualenv “nome” --python=”versão do python”
virtualenv ambvir --python=3
Abrir o ambiente
source nome/bin/activate
Desativando o ambiente virtual
deactivate

Desenvolvimento Web com Flask

instalando o pacote Venv no linux

Sudo apt-get install python3-venv

para criar o ambiente virtual:


python3 -m venv “nome do ambiente”
para ativar o ambiente digite no terminal:
source “nome do ambiente”/bin/activate

entrando em modo de depuração com:


export FLASK_APP=nome_do_arquivo.py
export FLASK_DEBUG=1
flask run

Para inicializar uma aplicação Flask é necessário criar uma instância da aplicação, ela
será tratada usando o protocolo WSGI (Web Server Gateway interfarce).
From flask import Flask
app = Flask(__name__)

rotas e funções de Views

A forma mais simples de definimos uma rota é usando o decorador @app.route()

Há também como utilizarmos uma forma dinamica de funções de Views


@app.route(‘/user/<name>’)
def user(name):
return ‘<h1>Hello, {}!</h1>’ .format(name)
Flask Jinja2

Delimitadores no Jinja

O Jinja2 possui três tipos de delimitadores mais utilizados. Cada delimitador é responsável
por concatenar um tipo de instrução aos templates criados em HTML. Basicamente, os
delimitadores são os seguintes:

● {% ... %} para utilizar métodos python nos templates;


● {{ ... }} para concatenar variáveis aos templates;
● {# ... #} para utilizar comentários nos templates.

Na interação de for existe uma variável chamada loop que podemos usar para fazer varias
coisas com o for

Macros são formas de repetir código html em várias páginas

filtros são formas de mostrar os dados de forma diferente no html

Internacionalização com Flask babel (seguir passo a passo da documentação)

Templates
O Flask trabalha com a extensão jinja2 para renderizar as páginas HTML.
Utilizando a função render_template() o primeiro argumento é o arquivo de template. já
todos os demais argumentos são pares chave-valor.

O Jinja2 reconhece vários tipos de variaveis. para se usar uma variavel é necessario utilizar
duas chaves {{ variavel }}

Exemplos de varíaveis:
<p>A value from a dictionary: {{ mydict[‘key’] }}. </p>
<p>A value from a list: {{ mylist[3] }}. </p>
<p>A value from a list, with a variable index: {{ mylist[myintvar] }}. </p>
<p>A value from a object’s method: {{ myobj.somemethod() }}. </p>

Ainda podemos modificar as variáveis através de filtros específicos.

Filtro Descrição

safe Renderiza o valor sem aplicar escape

capitalize Converte o primeiro caractere para letra maiúscula e o restante para


minúscula

lower Converte o valor para letras minúsculas


upper Converte o valor para letras Maiúsculas

tittle Converte o primeiro caractere de cada palavra para letra maiúscula

trim remove espaços em branco no ínicio e no fim do valor

striptags Remove qualquer tag HTML do valor antes de renderinzar

Dentro do HTML podemos usar Macros que são como as funções dentro de python
para que estes sejam mais utilizados deixamos eles em arquivos independentes que serão
importados depois.

Herança de templates

Uma maneira de não ficarmos repetindo códigos é a herança de templates, com ela
podemos repetir bases de códigos que iriam se repetir em toda a aplicação.
Para isso criamos uma base de html e definimos blocos de códigos que podem ser
substituídos.

Uma alternativa é usar o Flask-bootstrap que contém boa parte do código de CSS e JS do
próprio bootstrap.

Para se criar uma página de erro personalizada usa-se o decorador


@app.errorhandler(n°erro)

Links

Para se usar links dinâmicos ou não usamos a função do Jinja url_for()

Formulários com Flask-WTF

a extensão Flask WTF facilita a criação de formulários, para isso precisamos criar uma
classe com campos necessários.

from flask_wtf import FlaskForm -> para transformar a classe em formulario


from wtforms import StringField, SubmitField -> trás os campas necessarios
from wtforms.validators import DataRequired -> importa os validadores

class NameForm(FlaskForm)
name = StringField('Whats is your name?', validators=[DataRequired()])
submit = SubmitField('Submit')

Campos aceitos pelo WTForms:


Tipo de campo descrição

BooleanField caixa de seleção com valores True e False

DateField Campo de texto que aceita um valor datetime.date em um dado formato

DateTimeField Campo de texto que aceita um valor datetime.datetime em um dado formato

DecimalField Um campo de texto que aceita um valor decimal.decimal

FileField Campo para upload de arquivo

HiddenField campo de texto oculto

MultipleFileField campo para upload de vários arquivos

FieldList Lista de campos de um tipo de dado

FloatField campo de texto que aceita um valor com ponto flutuante

FormField Formulário incluído como um campo em um formulário contêiner

IntegerField campo de texto que aceita um número inteiro

PasswordField campo de texto para senhas

RadioField Lista de botões de Rádios

SelectField Lista suspensa de opções

SelectMultipleField Lista suspensa de opções com múltipla seleção

SubmitField Botão para envio do fórmulario

StringField campo de texto

TextAreaField Campo de texto multilinha

além disso ainda podemos incluir validadores como os exemplos abaixo:

Validador Descrição

DataRequired Válida se o campo contém dados após a conversão de tipo

Email Válida um endereço de email

EqualTo Compara valores de Dois campos (útil para confirmação de senha ou email)

InputRequired Válida se o campo contem dados antes da conversão do tipo

IPAddress válida um endereço de rede IPv4

Length Válida o tamanho da String inserida


MacAddress Válida um endereço de MAC

NumbeRange Válida se o valor inserido está em um intervalo numérico

Optional Permite uma entrada vazia no campo ignorando validadores adicionais

Regexp Valida a entrada em relação a uma expressão regular

URL Válida uma URL

UUID Válida um UUID

AnyOf Válida se a entrada é uma das opções de uma lista de valores possíveis

NoneOF Válida se a entrada não é nenhuma das opções de uma lista de valores
possíveis

Chamando um formulário simples de nome

<form method=’POST”>
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name(id=’my-text-field’) }}
{{ form.submit() }}
</form>

Banco de dados

Existem dois tipos de Banco de dados

SQL -> Structured Query Languages - Utilizam consultas de querys - banco de dados
relacionais
NoSQL -> utilizam dados em forma de chave - valor e orientados a documentos.

Na classificação do diagrama de entidade-relacionamento tempos dois tipos de ligação

Um-para-muitos -> significa que uma informação na tabela x pode aparecer varias vezes na
tabela y
Um-para-um -> significa que a informação na tabela x aparece somente uma vez na tabela
y
Configurando um banco de dados com SQL Alchemy

Engine de Banco de dados URL

MySQL mysql://username:password@hotsname/database

Postgres postgresql://username:password@hostname/database

SQLite sqlite:///absolute/path/to/database

configurando o SQLlite
import os
from flask_sqlalchemy import SQLAlchemy

basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'+ os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

bd = SQLAlchemy(app)

class Role(db.Model): -> definindo a classe para criação da tabela


__tablename__ = 'roles' -> nome da tabela
id = db.Column(db.integer, primary_key=True) -> criando coluna da tabela
name = db.Column(db.String(64), unique=True)

def __repr__(self): -> criando representação para testes.


return '<role %r>' % self.name

Tipos de colunas do SQLAlchemy

Nome do Tipo Tipo Python Descrição

Integer int inteiros comuns, em geral com 32 bits

SmallInteger int Inteiros de intervalos pequeno, em geral com 16 bits

BigInteger int ou long Inteiros com precisão ilimitada

Float float números de ponto flutuante

Numeric decimal.decimal números de ponto fixo

String str String de tamanho variável

Text str String de tamanho variável, otimizada para tamanho grande ou sem
limite
Unicode unicode string unicode de tamanho variável

UnicodeText unicode String unicode de tamanho variável, otimizada para tamanho grande
ou sem limite

Boolean bool Valor booleano

Date datetime.date Data

Time datetime.time Hora

DateTIme datetime.datetime Data e hora

Interval datetime.timedelta Intervalo de tempo

Enum str Lista de valores do tipo string

PickleType qualquer objeto py Serialização pickle automática

LargeBinary str Blob binário

Configurações do db.Column

Nome da opção Descrição

primary_key Se for definido como True a coluna será a chave primária da Tabela

unique Se for definido como True, não permitirá valores duplicados

index Se for definido como True, um índice será criado para essa coluna, para que
as consultas sejam mais eficientes

nullalbe Se for definido como True, haverá valores vazios nessa coluna. Se for
definido como False a Coluna não aceitará valores vazios

default Define um valor default para a coluna


Relacionamento entre tabelas

Para se conectar uma tabela a outra deve ser utilizar a função db.relationship, segue o
exemplo das classes atualizadas com os modelos já relacionados.

class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
users = db.relationship('users', backref='role')

def __repr__(self):
return '<role %r>' % self.name

class User(db.Model):
__tablename = 'users'
id = db.Column(db.integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.integer, db.ForeignKey('roles.id'))

def __repr__(self):
return '<user %r>' % self.username]

Opções de relacionamento no SQLAlchemy

Nome da opção Descrição

backref Adiciona uma referência para trás no outro modelo do relacionamento

primaryjoin especifica a condição de junção entre os dois modelos explicitamente. É necessário


somente em relacionamentos ambíguos.

lazy Especifica como os itens relacionados devem ser carregados. Os valores Possíveis
são: select(os itens são carregados por demanda na primeira vez que são
acessados), immediate(os itens são carregados quando o objeto-fonte é carregado),
joined (os itens são carregados imediatamente, mas como uma junção), subquery
(os itens são carregados imediatamente, mas como uma subquery), noload (os itens
jamais são carregados), dynamic (em vez de carregar os itens, a query que pode
carregá los e dada)

userlist Se for definido como False, usa um escalar no lugar de uma lista

order_by Especifica a ordem usada para os itens no relacionamento

secondary especifica o nome da tabela de associação a ser usada em relacionamento de muitos


para muitos

secondaryjoin especifica o nome da tabela de associação a ser usada em relacionamento de muitos


para muitos quando o SQLAlchemy não puder determiná-la por conta própria

Iniciando o banco de dados pelo flask shell


export FLASK_APP=app.py
flask shell
from app import db
db.create_all()

Esse código cria o banco de dados com o final.sqlite

para adicionar linhas no db primeiro importamos as classes que haviamos criado e então
inserimos elas como variaveis.

from app import Rule, User


admin_role = Role(name=’Admin’)
user_role = Role(name=’usern’)
user_anne = User(username=’Anne’, roler=admin_role)
user_susan = User(username=’Susan’, roler=user_role)
podemos adicionar as informações no db de duas formas diferentes, uma séria adicionar
linha a linha
db.session.add(admin_role)
db.session.add(user_anne)

ou então podemos adicionar tudo em uma lista com a função


db.session.add_all([admin_role, user_role, user_anne])

após adicionado temos que dar o comando db.session.commit() para gravar as


informações. se por acaso gravarmos a informação errada podemos dar o comando
db.session.rollback() que ele irá desfazer as alterações

para alterar uma linha de alguma tabela utilizamos o método add() em uma nova variavel.
para deletar uma linha usamos o método db.session.delete()

e também podemos usar a query para consultar as informações


Role.query.all()

Filtros de consulta query comun

Opção Descrição

filter() devolve uma nova consulta que adiciona um filtro extra a consulta original

filter_by() devolve uma nova consulta que adiciona um filtro extra de igualdade a consulta
original

limit() devolve uma nova consulta que limita o número de resultado da consulta
original

offset() devolve uma nova consulta que aplica um offset na lista de resultado da
consulta original

Order_by() devolve uma nova consulta que ordena o resultado da consultas com os
critérios passados

group_by() devolve uma nova consulta que agrupa o resultado da consulta original de
acordo com os critérios passados

métodos mais comuns usados nas consultas

opção descrição

all() Devolve todos os resultados de uma consulta na forma de lista

first() devolve o primeiro resultado de um consulta ou None se não houver


nenhum resultado

first_or_404() devolve o primeiro resultado de um consulta ou aborta a requisição e


envia um erro 404 como resposta se não houver resultado

get() devolve a linha que corresponde a chave primária especificada ou None


se a consulta for sem resultado

get_or_404() devolve a linha que corresponde a chave primária especificada ou, se


caso não for encontrada aborta a requisição e envia um erro 404 como
resposta

count() devolve o número de resultados da consulta

paginate() devolve o objeto pagination que contem o intervalo de resultado


especificado

Flask Migrations

O framework Flask Migrations Atua como uma ferramenta de controle de versão de


Migração(atualização) do banco de dados. ele atualiza e ajdua a entender as mudanças
feitas no db.

para iniciar o Migrations deve ser usar o comando

flask db init
commitando a alteração - flask db migrate -m “commit”
atualizando - flask db upgrade

Segurança com Flask

Aplicação de Blogging social

Com a nova configuração das pastas é necessário criar uma função factory que agiliza na
hora que precisarmos ajustar alguma configuração

depois devemos definir uma blueprint para as rotas já que com a factory as rotas precisam
ser acessadas externamente

Autenticação de usuário

Hashing de senha com werkzeug


Utilizando o módulo securty do Werkzeug fornece uma maneira facil de fazer o hashing de
senha utilizando as funções

utilizada para armazenar a senha no banco de dados


Generrate_password_hash(password, method = ‘pbkdf2:sha256’, salt_length=8)

utilizado para verificar se a senha está correta


check_password_hash(hash, password)

Registrando estado de login com flask-login

Para a extensão funcionar deve ser adicionado classe de db do User utilizando os seguintes
itens

Método Descrição

is_authenticated Deve ser True se o usuário tiver credenciais de logins válidas ou false
caso contrário

is_active Deve ser True se o usuário tiver permissão para fazer login, ou False
caso contrário. Um false pode ser usado para contas inativas

is_anonymous Deve ser sempre False para usuários comuns e True para um objeto
de usuário especial que representa um usuário anônimo

get_id() Deve devolver um identificador único para usuários, codificado em


uma string unicode

Permissões de usuários

Para criar permissões para usuários é interessante usar potências de dois pois elas se
combinam e criam valores únicos. é uma maneira eficiente de se conseguir gerenciar as
permissões

Envio de Email

Para fazer o envio de Emails usamos a lib flask-Mail

podemos configurar o servidor de SMTP com as seguintes chaves


Chave Default Descrição

MAIL_SERVER localhost Nome do Host ou IP do servidor de emails

MAIL_PORT 25 Porta do servidor de emails

MAIL_USE_TLS False ativa a segurança de TLS ( transport layer Security ou segurança da


camada de transporte)

MAIL_USE_SSL False Ativa a segurança de SSL(secure socket layer ou Camada de Segurança


de sockets)

MAIL_USERNAME None E-mail do usuário da conta de email

MAIL_PASSWORD None Senha da conta de email

Introdução ao REST(Representational State Transfer)

A arquitetura REST para web services se baseia em seis características, são elas

Cliente-servidor
Deve haver uma separação clara entre clientes e servidores.

Sem estado(stateless)
Uma Requisição de cliente deve conter todas as informações necessárias para tratá la. o
Servidor não deve armazenar nenhum estado acerca do cliente, que seja persistente de
uma requisição para a próxima.

Cache
As respostas do servidor podem ser identificadas como passíveis ou não de cache, de
modo que os clientes (ou intermediários entre os clientes e o servidor) possam usar um
cache com vistas aá otimização.

Interface uniforme
O protocolo com o qual os clientes acessam os recursos do servidor devem ser
consistentes, bem definido e padronizado. Esse é o aspecto mais complexo do RESt,
incluindo o uso de identificadores únicos e representações dos recursos, mensagens
autodescritivas entre o cliente e o servidor, além de hipermídia.

Sistemas em camadas
Servidores proxy, cache ou gateways podem ser inseridos entre os clientes e os servidores
conforme forem necessários às fim de melhorar o desempenho a confiabilidade e a
escalabilidade

Código por demanda


Os clientes podem opcionalmente, fazer download de código do servidor para executá-lo
em seu contexto
Numa API tudo se torna recurso.
No caso de uma aplicação de blog social, usuários, postagens e comentarios são recursos.
Cada recurso deve ter uma rota única.

métodos de Requisição

Método da Alvo Descrição Código


requisição HTTP

GET URL do recurso Obem o Recurso 200


individual

GET URL de conjunto Obtém o conjunto de recursos(ou uma página deles, se o 200
de recursos servidor implementar paginação)

POST URL de Conjunto Cria um recurso e o adiciona ao conjunto, O Servidor escolhe o 201
de recurso URL do novo Recurso e o devolve em um cabeçalho Location
na resposta

PUT URL do recurso Modifica um recurso existente como alternativa, esse método 200 ou
individual também pode ser usado para criar um recurso, se o cliente 204
puder escolher a URL do recurso.

DELETE URL do recurso Apaga o recurso 200 ou


individual 204

DELETE URL de Conjunto Apaga todos os recursos de um conjunto 200 ou


de recurso 204

O protocolo HTTP ainda conta com os métodos Head e Options que são
automaticamente implementados pelo flask.

Os recursos são enviados de um lado para o outro entre o cliente e o servidor, como o
REST não especifica o formato o cabeçalho content-type nas requisições e nas resposta
é usado para sinalizar o formato (geralmente JSON (JavaScript Object Notation)

Códigos de requisição

Código HTTP Nome Descrição

200 Ok A requisição foi concluído com sucesso

201 Created (criado) A requisição foi concluída com sucesso e como resultado
um novo recurso foi criado

202 Accepted (Aceito) A requisição foi aceita para ser processada, mas continua
em andamento e executará assincronamente

204 No Content (Sem conteúdo) A requisição foi concluída com sucesso e não há dados
para serem devolvidos.

400 Bad Request (Requisição inválida) A requisição é inválida ou inconsistente

401 Unauthorized (Não autorizado) A requisição não inclui informações sobre autenticação, ou
as credenciais fornecidas são inválidas

403 Forbidden (Proibido) As credenciais para autenticação enviadas com a


requisição são insuficientes

404 Not Found (Não Encontrado) o recurso referenciado no URL não foi encontrado

405 Method Not Allowed (Método não o método requisitado não é aceito para o recurso
permitido) especificado

500 Internal Server Erro (Erro interno do Um erro inesperado ocorreu durante o processamento da
Servidor) requisição

Você também pode gostar