FastAPI

You must import

from fastapi import FastAPI
# & uvicorn for running it

Command to run & docks page

uvicorn main:app --reload

# docs url is: http://127.0.0.1:8000/docs

Basic

app = FastAPI()

@app.get('/')
def home():
    return {'message': 'Hello World!'}

GET

# path parameter
@app.get('/get-student/{student_id}')
def get_student(student_id: int):
    return students[student_id]

# query parameter
# aka: name?test=1&name=ben
@app.get('/name')
def get_name(test: int, name: str):
    for student_id in students:
        if students[student_id]['name'] == name:
            return students[student_id]
    return {
        'Data': None
    }

Path

from fastapi import FastAPI, Path


# can specify a decription, and limits such as
# lt = less than
# gt = greater than
# le = less than or equal to
# ge = greater than or equal to
@app.get('/get-student/{student_id}')
def get_student(student_id: int = Path(..., description='The ID of the student you want to view', gt=0, lt=5)):
    return students[student_id]

Optional

from typing import Optional

# query parameter
@app.get('/name')
def get_name(test: int, name: Optional[str] = None):
    for student_id in students:
        if students[student_id]['name'] == name:
            return students[student_id]
    return {
        'Data': None
    }

Everything put together

# query parameter + path parameter
@app.get('/get-by-name/{student_id}')
def get_student_by_name(student_id: int, name: Optional[str] = None):
    for student_id in students:
        if students[student_id]['name'] == name:
            return students[student_id]
    return {
        'Data': None
    }

POST

from pydantic import BaseModel

# request body
class Student(BaseModel):
    name: str
    age: int
    year: str


@app.post('/create-student/{student_id}')
def create_student(student_id: int, student: Student):
    if student_id in students:
        return {
            'Error': 'Student exists'
        }
    students[student_id] = student
    return students[student_id]

PUT

# put
class UpdateStudent(BaseModel):
    name: Optional[str] = None
    age: Optional[int] = None
    year: Optional[str] = None

@app.put('/update-student/{student_id}')
def update_student(student_id: int, student: UpdateStudent):
    if student_id not in students:
        return {
            'Error': 'Student does not exist'
        }

    if student.name is not None:
        students[student_id].name = student.name

    if student.age is not None:
        students[student_id].age = student.age

    if student.year is not None:
        students[student_id].year = student.year

    return students[student_id]

DELETE

# delete
@app.delete('/update-student/{student_id}')
def delete_student(student_id: int):
    if student_id not in students:
        return {
            'Error': 'Student does not exist'
        }
    del students[student_id]
    return {
        'Message': 'Student deleted successfully'
    }