Flask и Fastapi – это две очень популярные рамки Python для создания API в Python. В этом уроке мы будем ходить через создание API с обоими с полным CRUD. Мы не будем использовать базу данных или ORM. Несмотря на использование приведенных ниже шаблонов, вы можете адаптировать свой предпочтительный уровень данных в свой API. Таким образом, вместо базы данных мы определим нашу модель, используя класс и используем список для создания, чтения, обновления и удаления наших данных.
Перед выполнением этого урока обязательно установили недавнюю версию Python 3.
Краткое описание конвенции о спокойной
Сторпное соглашение дает нам план создания основных маршрутов для функциональности CRUD (создавать, читать, обновить, удалить) одинаковым способом.
API Restful Routes
Возвращает список всех элементов | /модель | Показатель | ПОЛУЧИТЬ |
Возвращает элемент с соответствующим удостоверением личности | /model/: id | Шоу | ПОЛУЧИТЬ |
Создает новый элемент, возвращает элемент или подтверждение | /модель | Создавать | Сообщение |
Обновленный элемент с соответствующим идентификатором | /model/: id | Обновлять | Положить/патч |
Удаляет элемент с соответствующим удостоверением личности | /model/: id | Разрушать | Удалить |
Если бы мы не строили API, но вместо этого рендеринг страниц на сервере, было бы два дополнительных маршрута. Новый, который отдает страницу с формой для создания нового объекта, отправляя форму, запускает маршрут создания. Редактировать, которая отдает страницу с формой для редактирования существующего объекта, отправляя форму, запуская маршрут обновления.
Поскольку мы строим API, редактирование и новое не необходимы, поскольку бремя сбора информации для представления в маршруте создания и обновления будет на том, кто строит приложения, которые потребляют API. (Frontend Applications встроенные в рамки)
API в колбе
Настраивать
Создайте новый проект из Этот шаблон и клонировать его на свой компьютер.
Перейдите на свой терминал в папку проекта и создайте виртуальную среду Python
Python -M Venv Venv
активировать виртуальную среду
Источник ./venv/bin/активировать
Установите все зависимости от требований.txt
PIP установка -R TEDS.TXT
Чтобы обновить Telect.txt, если вы установите больше библиотек, используйте следующую командуPIP FREEZE> TEDS.TXT
Проверьте, что сервер работает, запустив
python server.py
и отправиться в Localhost: 7000, чтобы увидеть, сможете ли вы увидеть маршрут по умолчанию. (Подробнее о шаблоне в readme.md)
Настройка наших моделей
Опять же, мы не используем базу данных, а для проведения движений мы настроем наш класс и массив в папке моделей. (При MVC все ваши модели данных и ORM должны быть определены в папке моделей).
Мы будем:
- Создайте класс BlogPost с названием и собственностью тела, Функция конструктора
- Мы создадим пустой массив, чтобы держать наши сообщения в блоге.
- Мы создадим образец блога и добавим его в массив
/models/__init__.py
# Our Blog Post Class class BlogPost: # Define our Properties title = "" body = "" #define our constructor def __init__(self, title, body): self.title = title self.body = body # An Empty Array to hold our BlogPosts posts = [] # A Sample BlogPost first_post = BlogPost("My First Post", "The Body of My Post") # Add the Post to our array posts.append(first_post)
Индексный маршрут
Маршрут стандартного получения соответствует следующей подписи
- Получить запрос = > “/modelname” => Возвращает JSON всех предметов модели
Так Поскольку наша модель – блог -пост, это означает …
- Получить запрос => “/blogpost” => Возвращает JSON всех постов блогов
Для наших маршрутов мы будем работать из папки контроллеров.
Мы будем:
- импортировать наш класс и массив
- Создайте маршрут GET. Возвращение словаря со свойством, которое является кортежей словарных версий объектов BlogPost, мы будем использовать карту, чтобы зацикливаться на объектах BlogPost и преобразовать их в словаря.
/controllers/__init__.py
from flask import Blueprint from models import BlogPost, posts ############################################# ## USE THIS FILE TO DEFINE ANY Routes ## Create Sub Blueprints as needed ############################################# home = Blueprint("home", __name__) @home.get("/") def home_home(): return {"home": "this is the home route"} ## BlogPost Index Route @home.get("/blogpost") def home_blogpost(): # map over array of posts converting to tuple of dictionaries return {"posts": tuple(map(lambda bp : bp.__dict__, posts))}
Запустите свой сервер
python server.py
Перейдите в Localhost: 7000/blogpost и посмотрите, получите ли вы ответ JSON
Шоу маршрута
Шоу маршрута возвращает единый пост в блоге, основанный на A, передается через URL. Хотя мы не используем базу данных, поэтому вместо идентификатора Мы просто используем индекс списка.
Получить запрос =>/blogpost/
=> вернуть один объект
/controllers/__init__.py
from flask import Blueprint from models import BlogPost, posts ############################################# ## USE THIS FILE TO DEFINE ANY Routes ## Create Sub Blueprints as needed ############################################# home = Blueprint("home", __name__) @home.get("/") def home_home(): return {"home": "this is the home route"} ## BlogPost Index Route @home.get("/blogpost") def home_blogpost(): # map over array of posts converting to tuple of dictionaries return {"posts": tuple(map(lambda bp : bp.__dict__, posts))} ## BlogPost Show Route @home.get("/blogpost/") def home_blogpost_id(id): id = int(id) return posts[id].__dict__
Запустите свой сервер
python server.py
Перейдите в Localhost: 7000/blogpost/0 и посмотрите, получите ли вы ответ JSON
Маршрут создания
Маршрут создания позволяет нам отправлять детали нового объекта, который мы хотим сделать в теле запроса, и создать новый элемент. Это потребует доступа к органу запроса, который выполняется объектом запроса Flask. Затем мы вернем недавно созданный объект в качестве ответа.
- Post request => “/blogpost” => создает и возвращает новый объект Blogpost
/controllers/__init__.py
from flask import Blueprint, request from models import BlogPost, posts ############################################# ## USE THIS FILE TO DEFINE ANY Routes ## Create Sub Blueprints as needed ############################################# home = Blueprint("home", __name__) @home.get("/") def home_home(): return {"home": "this is the home route"} ## BlogPost Index Route @home.get("/blogpost") def home_blogpost(): # map over array of posts converting to tuple of dictionaries return {"posts": tuple(map(lambda bp : bp.__dict__, posts))} ## BlogPost Show Route @home.get("/blogpost/") def home_blogpost_id(id): id = int(id) return posts[id].__dict__ @home.post("/blogpost") def home_blopost_create(): #get dictionary of request body body = request.json # Create new BlogPost post = BlogPost(body["title"], body["body"]) # append new BlogPost object to posts array posts.append(post) # return the new post as JSON return post.__dict__
Запустите свой сервер
python server.py
Использование такого инструмента, как почтальон, сделайте запрос сообщения в
Localhost: 7000/blogpost
и отправьте такую же тело JSON:
{ "title":"Another Post", "body": "bloggity bloggity" }
- Запросите маршрут индекса снова, чтобы подтвердить объект был добавлен
Маршрут обновления
Маршрут обновления должен позволить нам передать идентификатор определенного объекта в URL -адреса вместе с данными в теле запроса. Он обновит объект с помощью этого идентификатора, используя данные в корпусе запроса.
- Поместить/патч запрос на
/blogpost/
=> return Обновленный объект
/controllers/__init__.py
from flask import Blueprint, request from models import BlogPost, posts ############################################# ## USE THIS FILE TO DEFINE ANY Routes ## Create Sub Blueprints as needed ############################################# home = Blueprint("home", __name__) @home.get("/") def home_home(): return {"home": "this is the home route"} ## BlogPost Index Route @home.get("/blogpost") def home_blogpost(): # map over array of posts converting to tuple of dictionaries return {"posts": tuple(map(lambda bp : bp.__dict__, posts))} ## BlogPost Show Route @home.get("/blogpost/") def home_blogpost_id(id): id = int(id) return posts[id].__dict__ @home.post("/blogpost") def home_blopost_create(): #get dictionary of request body body = request.json # Create new BlogPost post = BlogPost(body["title"], body["body"]) # append new BlogPost object to posts array posts.append(post) # return the new post as JSON return post.__dict__
Запустите свой сервер
python server.py
Использование такого инструмента, как Postman, сделайте запрос на то, чтобы PUT или Patch в
Localhost: 7000/blogpost/0
и отправьте такую же тело JSON:
{ "title":"Updated Post", "body": "bloggity bloggity" }
- Запросите маршрут индекса снова, чтобы подтвердить объект был обновлен
Удалить маршрут
Маршрут удаления принимает идентификатор объекта в URL и удаляет этот объект, возвращает удаленный объект.
- Удалить запрос в
/blogpost/
Возвращает удаленный объект
/controllers/__init__.py
from flask import Blueprint, request from models import BlogPost, posts ############################################# ## USE THIS FILE TO DEFINE ANY Routes ## Create Sub Blueprints as needed ############################################# home = Blueprint("home", __name__) @home.get("/") def home_home(): return {"home": "this is the home route"} ## BlogPost Index Route @home.get("/blogpost") def home_blogpost(): # map over array of posts converting to tuple of dictionaries return {"posts": tuple(map(lambda bp : bp.__dict__, posts))} ## BlogPost Show Route @home.get("/blogpost/") def home_blogpost_id(id): id = int(id) return posts[id].__dict__ ## The BlogPost Create Route @home.post("/blogpost") def home_blopost_create(): #get dictionary of request body body = request.json # Create new BlogPost post = BlogPost(body["title"], body["body"]) # append new BlogPost object to posts array posts.append(post) # return the new post as JSON return post.__dict__ #The BlogPost Update Route @home.route("/blogpost/ ", methods=["Put", "Patch"]) def home_update_blogpost(id): # get id id = int(id) # get request body body = request.json # get post to be updated post = posts[id] # update post post.title = body["title"] post.body = body["body"] # return updated object return post.__dict__ @home.delete("/blogpost/ ") def home_blogpost_delete(id): # get id id = int(id) # remove the item from the array post = posts.pop(id) # return removed item return post.__dict__
Запустите свой сервер
python server.py
Использование такого инструмента, как почтальон, сделайте запрос удаления в
Localhost: 7000/blogpost/0
Запросите маршрут индекса снова, чтобы подтвердить объект был удален
API в Fastapi
Настраивать
Создайте новый проект из Этот шаблон и клонировать его на свой компьютер.
Перейдите на свой терминал в папку проекта и создайте виртуальную среду Python
Python -M Venv Venv
активировать виртуальную среду
Источник ./venv/bin/активировать
Установите все зависимости от требований.txt
PIP установка -R TEDS.TXT
Чтобы обновить Telect.txt, если вы установите больше библиотек, используйте следующую командуPIP FREEZE> TEDS.TXT
Проверьте, что сервер работает, запустив
python server.py
и отправиться в Localhost: 7000, чтобы увидеть, сможете ли вы увидеть маршрут по умолчанию. (Подробнее о шаблоне в readme.md)
Настройка наших моделей
Опять же, мы не используем базу данных, а для проведения движений мы настроем наш класс и массив в папке моделей. (При MVC все ваши модели данных и ORM должны быть определены в папке моделей).
Мы будем:
- Создайте класс BlogPost с названием и собственностью тела, Функция конструктора
- Мы создадим пустой массив, чтобы держать наши сообщения в блоге.
- Мы создадим образец блога и добавим его в массив
/models/__init__.py
# Our Blog Post Class class BlogPost: # Define our Properties title = "" body = "" #define our constructor def __init__(self, title, body): self.title = title self.body = body # An Empty Array to hold our BlogPosts posts = [] # A Sample BlogPost first_post = BlogPost("My First Post", "The Body of My Post") # Add the Post to our array posts.append(first_post)
Индексный маршрут
Маршрут стандартного получения соответствует следующей подписи
- Получить запрос = > “/modelname” => Возвращает JSON всех предметов модели
Так Поскольку наша модель – блог -пост, это означает …
- Получить запрос => “/blogpost” => Возвращает JSON всех постов блогов
Для наших маршрутов мы будем работать из папки контроллеров.
Мы будем:
- импортировать наш класс и массив
- Создайте маршрут GET. Возвращение словаря со свойством, которое является кортежей словарных версий объектов BlogPost, мы будем использовать карту, чтобы зацикливаться на объектах BlogPost и преобразовать их в словаря.
/controllers/__init__.py
from fastapi import APIRouter from models import BlogPost, posts ########################################## ## Setup Your Routes in This File ########################################## home = APIRouter(prefix="") @home.get("/") async def home_home(): return {"home": "The Homepage"} # Index Route @home.get("/blogpost") async def index(): # map over array of posts converting to tuple of dictionaries return {"posts": tuple(map(lambda bp : bp.__dict__, posts))}
Запустите свой сервер
python server.py
Перейдите в Localhost: 7000/blogpost и посмотрите, получите ли вы ответ JSON
Шоу маршрута
Шоу маршрута возвращает единый пост в блоге, основанный на A, передается через URL. Хотя мы не используем базу данных, поэтому вместо идентификатора Мы просто используем индекс списка.
Получить запрос =>/blogpost/{id} => вернуть один объект
/controllers/__init__.py
from fastapi import APIRouter from models import BlogPost, posts ########################################## ## Setup Your Routes in This File ########################################## home = APIRouter(prefix="") @home.get("/") async def home_home(): return {"home": "The Homepage"} # Index Route @home.get("/blogpost") async def index(): # map over array of posts converting to tuple of dictionaries return {"posts": tuple(map(lambda bp : bp.__dict__, posts))} # Show Route @home.get("/blogpost/{id}") async def show(id:int): ## Return the post with the right index return posts[id].__dict__
Запустите свой сервер
python server.py
Перейдите в Localhost: 7000/blogpost/0 и посмотрите, получите ли вы ответ JSON
Маршрут создания
Маршрут создания позволяет нам отправлять детали нового объекта, который мы хотим сделать в теле запроса, и создать новый элемент. Чтобы использовать тело запроса в FastAPI, наша модель должна наследовать от базовой модели FastAPI. Затем мы можем использовать его в качестве типа, и FastAPI автоматически сделает тело доступным через объект модели.
- Post request => “/blogpost” => создает и возвращает новый объект Blogpost
Сначала давайте обновим нашу модель
модели/__ init__.py
# Import BaseModel from Pydantic from pydantic import BaseModel # Our Blog Post Class class BlogPost: # Define our Properties and types, which allows FastApi to validate title = "" body = "" #define our constructor def __init__(self, title, body): self.title = title self.body = body # An Empty Array to hold our BlogPosts posts = [] # A Sample BlogPost first_post = BlogPost("My First Post", "The Body of My Post") # BlogPostBody Class for Receiving Our Request Body class BlogPostBody(BaseModel): title:str body:str # Add the Post to our array posts.append(first_post)
/controllers/__init__.py
from fastapi import APIRouter from models import BlogPost, posts, BlogPostBody ########################################## ## Setup Your Routes in This File ########################################## home = APIRouter(prefix="") @home.get("/") async def home_home(): return {"home": "The Homepage"} # Index Route @home.get("/blogpost") async def index(): # map over array of posts converting to tuple of dictionaries return {"posts": tuple(map(lambda bp : bp.__dict__, posts))} # Show Route @home.get("/blogpost/{id}") async def show(id:int): ## Return the post with the right index return posts[id].__dict__ #Create Route @home.post("/blogpost") async def create(post: BlogPostBody): ## Create a New BlogPost posts.append(BlogPost(post.title, post.body)) ## Return the Post return post.__dict__
Сделайте запрос сообщения в
/Сообщение блога
Создание нового блога, вы можете использовать встроенную документацию FastAPI, чтобы проверить его, перейдя в/документы
Запросите маршрут индекса снова, чтобы подтвердить объект был добавлен
Маршрут обновления
Маршрут обновления должен позволить нам передать идентификатор определенного объекта в URL -адреса вместе с данными в теле запроса. Он обновит объект с помощью этого идентификатора, используя данные в корпусе запроса.
- Поместить/патч запрос на
/blogpost/{id}
=> return Обновленный объект
/controllers/__init__.py
from fastapi import APIRouter from models import BlogPost, posts, BlogPostBody ########################################## ## Setup Your Routes in This File ########################################## home = APIRouter(prefix="") @home.get("/") async def home_home(): return {"home": "The Homepage"} # Index Route @home.get("/blogpost") async def index(): # map over array of posts converting to tuple of dictionaries return {"posts": tuple(map(lambda bp : bp.__dict__, posts))} # Show Route @home.get("/blogpost/{id}") async def show(id:int): ## Return the post with the right index return posts[id].__dict__ #Create Route @home.post("/blogpost") async def create(post: BlogPostBody): ## Create a New BlogPost posts.append(BlogPost(post.title, post.body)) ## Return the Post return post.__dict__ #Update Route @home.api_route("/blogpost/{id}", methods=["Put", "Patch"]) async def update(id: int, post: BlogPostBody): # get post to be updated target = posts[id] # update the post target.title = post.title target.body = post.body # return the updated post return target.__dict__
Запустите свой сервер
python server.py
Использование такого инструмента, как почтальон или использование
/документы
Сделайте запрос на точки или патч вLocalhost: 7000/blogpost/0
и отправьте такую же тело JSON:
{ "title":"Updated Post", "body": "bloggity bloggity" }
- Запросите маршрут индекса снова, чтобы подтвердить объект был обновлен
Удалить маршрут
Маршрут удаления принимает идентификатор объекта в URL и удаляет этот объект, возвращает удаленный объект.
- Удалить запрос в
/blogpost/{id}
Возвращает удаленный объект
/controllers/__init__.py
from fastapi import APIRouter from models import BlogPost, posts, BlogPostBody ########################################## ## Setup Your Routes in This File ########################################## home = APIRouter(prefix="") @home.get("/") async def home_home(): return {"home": "The Homepage"} # Index Route @home.get("/blogpost") async def index(): # map over array of posts converting to tuple of dictionaries return {"posts": tuple(map(lambda bp : bp.__dict__, posts))} # Show Route @home.get("/blogpost/{id}") async def show(id:int): ## Return the post with the right index return posts[id].__dict__ #Create Route @home.post("/blogpost") async def create(post: BlogPostBody): ## Create a New BlogPost posts.append(BlogPost(post.title, post.body)) ## Return the Post return post.__dict__ #Update Route @home.api_route("/blogpost/{id}", methods=["Put", "Patch"]) async def update(id: int, post: BlogPostBody): # get post to be updated target = posts[id] # update the post target.title = post.title target.body = post.body # return the updated post return target.__dict__ #Destroy Route @home.delete("/blogpost/{id}") async def destroy(id: int): # remove post post = posts.pop(id) # return removed post return post.__dict__
Запустите свой сервер
python server.py
Используя такой инструмент, как почтальон или
/документы
Сделайте запрос удаления вLocalhost: 7000/blogpost/0
Запросите маршрут индекса снова, чтобы подтвердить объект был удален
Вывод
Теперь вы казаетесь основами построения полного CRUD API в колбе и Fastapi. Следующий шаг – попытаться сохранить данные, используя базу данных. Есть несколько вариантов баз данных и соответствующих библиотек, повеселиться с ним!
Оригинал: “https://dev.to/alexmercedcoder/basics-of-building-a-crud-api-with-flask-or-fastapi-4h70”