Привет! Это сообщение, чтобы получить знакомство с 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”