Привет! Это сообщение, чтобы получить знакомство с Fastapi. Давайте погрузимся в! Я буду структурировать этот пост на несколько разделов различных целей.
Разделы
- Начиная
- Структура проекта
- Входная точка
- База данных
- Моделей
- Трудные операции
- Определить конечные точки
Начиная
Чтобы начать нам нужно создать виртуальную среду и Fastapi. Создать виртуальную среду Python -M Venv Friends Активировать виртуальную среду Исходные друзья/Сценарии/Активировать
Установить fastapi PIP Установить fastapi
Нам понадобится сервер ASGI (интерфейс Asynchronous Server Gateway), в этом случае мы будем использовать Gunicorn. Пип устанавливает оружие
Структура проекта
Теперь, когда мы установили Fastapi, давайте определим структуру проекта. + – приложение |. + – в этом |. + – Crud.py |. + – db.py |. + – Модели .py + – друзья
Входная точка
Давайте отправимся на нашу main.py и напишите следующий код:
from fastapi import FastAPI
#initailize FastApi instance
app = FastAPI()
#define endpoint
@app.get("/")
def home():
return {"Ahoy": "Captain"}
Чтобы запустить это, выполните это из вашей командировки/терминала: Увикорн Главная: App --reload ** Главная * Относится к названию нашей точки входа ** приложение * Относится к экземпляру Fastapi, который мы инициализированы с Main.py ** наград * – это флаг, который позволяет серверу перезагрузить сам, когда мы вносим изменения в проект
Откройте свой браузер на ссылка Отказ Для автоматических интерактивных API документов:
- http://127.0.0.1.8000/docs -> Предоставляется Свагглы
- http://127.0.0.1.8000/REDOC -> Предоставляется Redoc.
База данных
Давайте инициализируем нашу базу данных. Поскольку у нас не будет много данных, мы собираемся использовать SQLite в качестве нашей базы данных. SQLite – это встроенная библиотека Python, поэтому нам не нужно его устанавливать. В отличие от Django, Fastapi не имеет своего собственного инструмента сопоставления объектов, поэтому мы собираемся использовать SQLalchemy. Чтобы установить SQLalchemy Run PIP установить SQLALCHEMY
Перейти к вашему db.py и напишите следующее:
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker #define sqlite connection url SQLALCHEMY_DATABASE_URL = "sqlite:///./friends_api.db" # create new engine instance engine = create_engine(SQLALCHEMY_DATABASE_URL) # create sessionmaker SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base()
Моделей
Давайте отправимся на Models.py Отказ Мы собираемся определить наши модели здесь.
from sqlalchemy import Column, Integer, String
from .db import Base
# model/table
class Friend(Base):
__tablename__ = "friend"
# fields
id = Column(Integer,primary_key=True, index=True)
first_name = Column(String(20))
last_name = Column(String(20))
age = Column(Integer)
Давайте вернемся к нашему main.py и сделать некоторые дополнения.
#add this to main.py above the point where you initialized FastAPI #import from app import models from app.db import engine #create the database tables on app startup or reload models.Base.metadata.create_all(bind=engine)
После сохранения новых изменений в main.py Вы поймете, что новый файл friends_api.db создано. Это наша база данных SQLite с именем, которое мы дали в нашей строке подключения от db.py
Трудные операции
Чтобы определить операции базы данных Crud (создать, чтение, обновление и уничтожение), давайте отправимся в Crud.py и напишите следующее:
from sqlalchemy.orm import Session
"""
Session manages persistence operations for ORM-mapped objects.
Let's just refer to it as a database session for simplicity
"""
from app.models import Friend
def create_friend(db:Session, first_name, last_name, age):
"""
function to create a friend model object
"""
# create friend instance
new_friend = Friend(first_name=first_name, last_name=last_name, age=age)
#place object in the database session
db.add(new_friend)
#commit your instance to the database
db.commit()
#reefresh the attributes of the given instance
db.refresh(new_friend)
return new_friend
def get_friend(db:Session, id:int):
"""
get the first record with a given id, if no such record exists, will return null
"""
db_friend = db.query(Friend).filter(Friend.id==id).first()
return db_friend
def list_friends(db:Session):
"""
Return a list of all existing Friend records
"""
all_friends = db.query(Friend).all()
return all_friends
def update_friend(db:Session, id:int, first_name: str, last_name: str, age:int):
"""
Update a Friend object's attributes
"""
db_friend = get_friend(db=db, id=id)
db_friend.first_name = first_name
db_friend.last_name = last_name
db_friend.age = age
db.commit()
db.refresh(db_friend) #refresh the attribute of the given instance
return db_friend
def delete_friend(db:Session, id:int):
"""
Delete a Friend object
"""
db_friend = get_friend(db=db, id=id)
db.delete(db_friend)
db.commit() #save changes to db
Мы сделаем с определением операций CRUD. Ура! 🥳.
Определить конечные точки
Мы почти закончили. Каждая отдельная строка кода, которую мы написали до сих пор, было создать для этого раздела.
Давайте вернемся к main.py : Добавьте следующее после того, как вы инициализировали свой экземпляр fastapi
from app.db import SessionLocal
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
Помните SessionLocal это связь с нашей БД. Функция get_db Это зависимость, такая, что, мы хотим, чтобы быть подключены к нашей базе данных, когда мы подключаемся или вызовете различные конечные точки.
Давайте увидим это в использовании с нашей первой конечной точкой. Добавьте это в main.py.
"""
So that FastAPI knows that it has to treat a variable as a dependency, we will import Depends
"""
from fastapi import Depends
#import crud to give access to the operations that we defined
from app import crud
#define endpoint
@app.post("/create_friend")
def create_friend(first_name:str, last_name:str, age:int, db:Session = Depends(get_db)):
friend = crud.create_friend(db=db, first_name=first_name, last_name=last_name, age=age)
##return object created
return {"friend": friend}
Сохранить main.py и отправиться на ваш браузер http://127.0.0.1.8000/docs и обновите страницу. Вы увидите, что у нас есть что-то новое. Так:
Нажмите на зеленый Создать друга Раздел, затем на левой стороне, нажмите Попробуйте это Отказ Заполните поля и нажмите на Blue Выполнить кнопка. В зависимости от того, что вы ввели, ваш ответ должен быть в этом формате:
{
"first_name": "mike",
"id": 1,
"age": 21,
"last_name": "dave"
}
Мы видим, что ответ – это словарь.
Давайте теперь добавим другие конечные точки для каждого из наших оставшихся трудных операций. (Пожалуйста, прочитайте комментарии в фрагментах для более легкого понимания) Получить объект друга
#get/retrieve friend
@app.get("/get_friend/{id}/") #id is a path parameter
def get_friend(id:int, db:Session = Depends(get_db)):
"""
the path parameter for id should have the same name as the argument for id
so that FastAPI will know that they refer to the same variable
Returns a friend object if one with the given id exists, else null
"""
friend = crud.get_friend(db=db, id=id)
return friend
Список объектов друга
@app.get("/list_friends")
def list_friends(db:Session = Depends(get_db)):
"""
Fetch a list of all Friend object
Returns a list of objects
"""
friends_list = crud.list_friends(db=db)
return friends_list
Обновить объект друга
@app.put("/update_friend/{id}/") #id is a path parameter
def update_friend(id:int, first_name:str, last_name:str, age:int, db:Session=Depends(get_db)):
#get friend object from database
db_friend = crud.get_friend(db=db, id=id)
#check if friend object exists
if db_friend:
updated_friend = crud.update_friend(db=db, id=id, first_name=first_name, last_name=last_name, age=age)
return updated_friend
else:
return {"error": f"Friend with id {id} does not exist"}
Удалить объект друга
@app.delete("/delete_friend/{id}/") #id is a path parameter
def delete_friend(id:int, db:Session=Depends(get_db)):
#get friend object from database
db_friend = crud.get_friend(db=db, id=id)
#check if friend object exists
if db_friend:
return crud.delete_friend(db=db, id=id)
else:
return {"error": f"Friend with id {id} does not exist"}
Вот и все сейчас!
Оригинал: “https://dev.to/mungaigikure/simple-fastapi-crud-3ad0”