GREEN: But this is really coding *against* the framework

This is noe the proper way to do it. FastAPI define schemas to do such
work.

The 'name' parameter was not passed (but seemed to work on live) and i
was looking for a database issue.

There might have been some colisions on import

However this show how to evolve from a mindset to another.
This commit is contained in:
Colin Goutte 2023-08-25 15:02:42 +02:00
parent e8aaa18baa
commit faf4841016
3 changed files with 44 additions and 10 deletions

27
crud.py Normal file
View File

@ -0,0 +1,27 @@
from sqlalchemy.orm import Session
import models
# import schemas
def create_movie(db: Session, name: str = ""):
db_movie = models.Movie(name=name)
db.add(db_movie)
db.commit()
db.refresh(db_movie)
return db_movie
def get_movie_by_name(db: Session, name: str = ""):
db_movie = db.query(models.Movie).filter(models.Movie.name == name)
return db.movie.all()
def get_movie_by_id(db: Session, id_: str = ""):
try:
id_ = int(id_)
except ValueError:
pass
db_movie = db.query(models.Movie).filter(models.Movie.id == id_)
return db_movie.one()

17
dev.py
View File

@ -1,10 +1,10 @@
from fastapi import FastAPI, Depends
from fastapi import FastAPI, Depends, Request
from sqlalchemy.orm import Session
import uvicorn
from database import SessionLocal, engine
import models
import crud
models.Base.metadata.create_all(bind=engine)
@ -26,8 +26,12 @@ async def root():
@app.post("/movies/")
async def create_movie(name: str = "", db: Session = Depends(get_db)):
async def create_movie(
name: str = "", db: Session = Depends(get_db), request: Request = None
):
out = {}
data = await request.json()
name = name or data["name"]
movie = models.Movie()
movie.name = name
db.add(movie)
@ -38,5 +42,12 @@ async def create_movie(name: str = "", db: Session = Depends(get_db)):
return out
@app.get("/movies/{id_}")
async def get_movie(id_: str, db: Session = Depends(get_db)):
movie = crud.get_movie_by_id(db, id_)
out = {k: v for (k, v) in movie.__dict__.items() if not k.startswith("_")}
return out
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=5000)

View File

@ -7,6 +7,8 @@ from database import Base
from dev import app, get_db
from models import Movie
import pytest
SQLALCHEMY_DATABASE_URL = "sqlite://"
engine = create_engine(
@ -41,12 +43,6 @@ def test_create_moviem_models():
assert movie.name == name
import pytest
import pytest
@pytest.mark.xfail
def test_create_movie_api():
import random
@ -55,5 +51,5 @@ def test_create_movie_api():
assert response.status_code == 200
movie_id = response.json()["id"]
assert f"Created {name}" in response.json()["message"]
response = client.get("movie", movie_id)
response = client.get(f"/movies/{movie_id}")
assert response.json()["name"] == name