# ativar o env
source env/bin/activate
# driver do mongodb para python
pip install pymongo
# habilita acesso assincrono ao pymongo (para o fastapi)
pip install motor
# adicionar no arquivo .env
MONGODB_URL="mongodb+srv://USERNAME:PASSWORD@cluster0.a00ka.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0"
ou arquivo que contém objeto app
(fastapi)
from fastapi.responses import Response
from typing_extensions import Annotated
from bson import ObjectId
import motor.motor_asyncio
from pymongo import ReturnDocument
import dotenv
import os
dotenv.load_dotenv(".env")
db_url = os.environ["MONGODB_URL"]
client = motor.motor_asyncio.AsyncIOMotorClient(db_url)
db = client.pycine
# representa id gerado no atlas
Arquivo models.py
class Movie(BaseModel):
# (id) é um alias para (_id) para manter o estado do objeto sincronizado com o database
# No entento (id) no python por convenção
id: Optional[PyObjectId] = Field(alias="_id", default=None)
# demais atributos ...
model_config = ConfigDict(
populate_by_name=True,
arbitrary_types_allowed=True,
json_encoders={ObjectId: str},
)
# Classe para armazenar o resultado do find()
class MovieCollection(BaseModel):
movies: List[Movie]
Routes (main.py
)
@app.get(
"/find/",
response_description="List all movies",
response_model=MovieCollection,
response_model_by_alias=False,
)
async def list_movies():
movies_collection = db.get_collection("movies")
return MovieCollection(movies=await movies_collection.find().to_list(20))
MovieDB.svelte
async function getMovies() {
const endpoint = `http://localhost:8000/find`;
const response = await fetch(endpoint);
const data = response.json();
if (response.ok) {
return data;
} else {throw new Error(data); }
}
Routes (main.py
)
@app.post(
"/save/",
response_description="Save Movie in collection.movies",
response_model=Movie,
status_code=status.HTTP_201_CREATED,
response_model_by_alias=False,
)
async def create_movie(movie: Movie = Body(...)):
new_movie = await movies_collection.insert_one(
movie.model_dump(by_alias=True, exclude=["id"])
)
created_movie = await movies_collection.find_one(
{"_id": new_movie.inserted_id}
)
return created_movie
async function save() {
const movieData = {
// get fields
}
const endpoint = `http://localhost:8000/save`;
const settings = {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify(movieData)
};
const res = await fetch(endpoint, settings);
const data = res.json();
if (res.ok) {
console.log(data);
return data;
} else {throw new Error(data); }
}
Para iniciar os serviços do back e front, executar os comandos abaixo para iniciar cada aplicação.
backend (fastapi):
cd web4
uvicorn main:app --reload
frontend (svelte):
cd web4/front
npm run dev -- --open
Atenção: se você fez git clone ou download desse projeto, o ambiente virtual precisa ser gerado na sua máquina. Executar os comandos abaixo para criar cada ambiente:
(1) Abrir o terminal, usar o git para baixar uma cópia desse projeto:
git clone https://github.com/fscheidt/web4
(2) Gerar ambiente virtual do backend (python):
cd web4
python3 -m venv env
source env/bin/activate
pip install -r requirements.txt
Resultado: a pasta env
é criada no projeto:
├── /env <--
├── /front
├── /json
├── /pycine
├── main.py
├── README.md
└── requirements.txt
(3) Instalar dependências do frontend (nodejs):
cd front
npm install
Resultado: a pasta node_modules
e .svelte-kit
são geradas:
├── /env
├── /front
│ ├── /node_modules <--
│ ├── /.svelte-kit <--
├── /json
├── /pycine
├── main.py
├── README.md
└── requirements.txt
Pydantic é uma biblioteca que facilita a serialização e deserialização de objetos em json e vice-versa. Além disso, pode-se usar o esquema de validação do pydantic para verificar se o json retornado possui os valores obrigatórios.
Instalação:
pip install pydantic
Gera um arquivo contendo todas as dependências do projeto:
source env/bin/activate
pip freeze > requirements.txt
Restaura o ambiente virtual
python3 -m venv env
pip install -r requirements.txt
Credenciais devem ser armazenadas em um arquivo de configuração, que não está rastreado pelo controle de versão ou seja compartilhado.
Permite a leitura do arquivo .env de configuração
pip install python-dotenv
Na pasta raiz do projeto, criar um arquivo chamado .env
com o conteúdo:
API_TOKEN = "COLOCAR_AQUI_O_TOKEN_DO_TMDB"
import os
import dotenv
dotenv.load_dotenv(".env")
token = os.environ["API_TOKEN"]
https://api.themoviedb.org/3/search/person?id=2000
https://api.themoviedb.org/3/search/person/2000
- Cadastro no site para gerar a chave da API:
- https://www.themoviedb.org/settings/api
python3 -m venv env
Ativa o ambiente para usar no projeto.
source env/bin/activate
# windows
.\env\scripts\activate
which python
pip install requests
Instalar o fastapi e o servidor uvicorn
pip install "fastapi[standard]" uvicorn
uvicorn main:app --reload
uvicorn main:app --reload --port=5000 # opcional se a port 8000 estiver em uso
- JSON (serialização de dados)
- API (application program interface)
- REST
Testar no terminal:
python3 --version
pip -V
extensão do vscode:
- thunder client
Notação para representar dados, usando chave-valor
{
"id": 13491,
"disciplina": "DESENVOLVIMENTO WEB IV",
"curso": {
"nome": "tads",
"turma": 2023
},
"professores": ["Felippe"],
"alunos": 14,
"turno": "noturno",
"ativa": true,
"ava": null,
"percentual": 5.5
}
Validação do json:
Estruturar numa representação json informações sobre filmes e series
Proponha um JSON que represente os dados contidos na página "ficha técnica".
Estruturar JSON para representar dados sobre a capital até Internet TLD do país Chile. Ver dados na página: