Рубрики
Без рубрики

Основы строительства CRUD API с колбой или FASTAPI

Flask и Fastapi – это две очень популярные рамки Python для создания API в Python. В этом … Tagged Flask, Fastapi, Python.

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”