Denne guide bygger ovenpå vores tidligere guide (del 2), hvor du fik lavet et API med FastAPI til Python, således at du kunne hente data for både alle film og en enkelt film.
Du skal derfor først have gennemgået vores tidligere guide for at kunne følge med her. Link til den guide (del 2) er: https://github.com/coding-pirates-hillerod/python-fastapi-get-started-part2
I denne guide vil du altså skulle bygge videre på dit API fra del 2, og her udvide det med en route, således at du nu også kan tilføje film til dit API's liste af film.
Helt konkret vil vi derfor i denne guide følge disse steps for at kode det:
- Lave en route for at tilføje film
- Starte din udviklingsserver
- Se og afprøve dit API i din browser
Fra vores tidligere API har vi denne kode:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
movies = [
{"id": 1, "title": "Harry Potter and the Sorcerer's Stone", "director": "Chris Columbus", "release_year": 2001},
{"id": 2, "title": "The Lord of the Rings: The Fellowship of the Ring", "director": "Peter Jackson", "release_year": 2001},
{"id": 3, "title": "Toy Story", "director": "John Lasseter", "release_year": 1995}
]
class Movies(BaseModel):
title: str
director: str
release_year: int
@app.get("/movies")
def get_movies():
"""Get all movies"""
return {"movies": movies}
@app.get("/movies/{movie_id}")
def get_movie(movie_id: int):
"""Get a specific movie by ID."""
for movie in movies:
if movie["id"] == movie_id:
return movie
return {"error": "Movie not found"}Og eneste vi skal nu er at tilføje en route, således at vi via vores browser kan tilføje en (eller flere) film til vores API's liste af film. Tilføj derfor følgende kode til dit API's kode:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
movies = [
{"id": 1, "title": "Harry Potter and the Sorcerer's Stone", "director": "Chris Columbus", "release_year": 2001},
{"id": 2, "title": "The Lord of the Rings: The Fellowship of the Ring", "director": "Peter Jackson", "release_year": 2001},
{"id": 3, "title": "Toy Story", "director": "John Lasseter", "release_year": 1995}
]
class Movies(BaseModel):
title: str
director: str
release_year: int
@app.get("/movies")
def get_movies():
"""Get all movies"""
return {"movies": movies}
@app.get("/movies/{movie_id}")
def get_movie(movie_id: int):
"""Get a specific movie by ID."""
for movie in movies:
if movie["id"] == movie_id:
return movie
return {"error": "Movie not found"}
@app.post("/movies")
def create_movie(movie: Movies):
"""Create a new movie entry."""
new_movie = {
"id": len(movies) + 1,
"title": movie.title,
"director": movie.director,
"release_year": movie.release_year
}
movies.append(new_movie)
return new_movieDet nye er altså her blot routen der starter fra kodelinjen med "@app.post("/movies")", hvilken blot vil gøre dig i stand til at tilføje film til dit API's liste af film via din browser.
Hvis ikke en udviklingsserver allerede køre, så du kan se og bruge dit API, så start den lige igen fra en terminal med denne kommando:
fastapi dev main.pyMed det er du faktisk allerede færdig med selve koden i denne guide.
MEN hvor du tidligere i din browser kunne gå til fx http://127.0.0.1:8000/movies for få data for alle film, og fx http://127.0.0.1:8000/movies/1 for at få data om én film (her filmen med id'et 1), så er vi nødt til at gå til en anden url for der at kunne bruge vores nye route til at tilføje en ny film til vores API's liste af film.
Så får at kunne tilføje en film til dit API, så skal gå til denne url (som er en form for dokumentation af dit API, som automatisk genereres af din FastAPI kode):
Ved at gå til den url skulle du gerne se en side i din browser lignende dette:
Herfra vil du kunne se alle de routes vi indtil videre har kodet til vores API. Og for nu at tilføje en ny film til vores API's liste af film, så skal du først trykke på sektionen/bjælken med den grønne knap der starter med "POST".
Gør du det så skulle du gerne se at sektionen/bjælken folder sig ud til noget der gerne skulle se sådan her ud:
Og for nu at prøve at tilføje en film, så skal du først trykke på den grå knap ude til højre med teksten "Try it out".
Trykker du på den knap, så skulle du gerne se en form for ny sektion folde sig ud a la nedenstående, som er den vi kan bruge til at tilføje en film:
Og i denne nye sektion vil vi nu under afsnittet "Edit Value" kunne indtaste data for en ny film, og med tryk på den blå knap "Execute" kunne tilføje en film til vores API's liste af film.
Ville vi derfor gerne tilføje en ny film som fx "Star Wars: Episode III – Revenge of the Sith", produceret af George Lucas og udgivet i 2005, så kan vi indtaste disse data (og bagefter trykke på "Execute" knappen for tilføje den) på denne måde:
Og trykker vi så herefter på den blå "Execute" knap, så vil vi under afsnittet "Responses" kunne se, at vi nu har tilføjet vores nye film (selve outputtet under "Responses" sektionen ser sikkert lidt mærkeligt ud for dig - og det er HELT okay! Men det vigtigste er at du under afsnittet "Response body" vil kunne se de data du har indtastet for den nye film, hvilket er et tegn på, at din film er blevet tilføjet dit API's liste af film):
Med det har du så nu faktisk færdiggjort dit API, således at du via dette kan:
- Se data for din liste af alle film
- Se data for en enkelt film
- Tilføje en ny film
Hvis du vil se, at din nye film faktisk er blevet tilføjet dit API's liste af film, så tryk først på sektionen med teksten "/movies" (øverst i dokumentationen i din browser), og tryk derefter på den grå knap "Try it out" ude til højre i denne sektion, og så til sidst på den blå "Execute" knap for det.
Dette materiale er lavet med bidrag af:
- Jonas Bak Phillispn (Formand og Kaptajn for Coding Pirates Hillerød)
Igen er der til denne guide gjort (rigtig godt) brug af RealPython artiklen "Get Started With FastAPI", hvorfor der (igen, igen) skal lyde et kæmpe tak til dem og alt det gode materiale om Python de laver ❤️