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

Flask REST API – Руководство по настройке приложения Flask

В этой статье мы познакомимся с API и API REST, а затем создадим наше собственное приложение Flask REST API.

Автор оригинала: Pankaj Kumar.

В этой статье мы познакомимся с API и API REST, а затем создадим наше собственное приложение Flask REST API.

Что такое API?

API или интерфейс прикладного программирования предоставляет интерфейс для взаимодействия с различными приложениями. Используя API, мы можем извлекать, обрабатывать, и отправлять данные | – значения из других приложений.

Например, рассмотрим веб-приложение. Клиент отправляет некоторые данные в виде запроса, сервер затем обрабатывает их, а затем отправляет соответствующие данные ответа обратно клиенту.

Весь этот процесс взаимодействия осуществляется через API. Итак, давайте еще раз взглянем на этот пример и посмотрим, где находится роль API.

Следовательно, клиент отправляет на сервер API, содержащий данные запроса. Сервер обрабатывает его, а затем отправляет Клиенту другой API, содержащий соответствующие данные ответа.

Операции CRUD и методы HTTP

При использовании API Клиент может отправлять данные запроса на сервер различными способами. Эти типы называются операциями CRUD .

Каждый оператор CRUD ( Create Retrieve Update Delete ) имеет связанный с ним HTTP-метод.

Давайте посмотрим на них сейчас:

  • Метод GET HTTP– Извлекает определенную информацию (для целей просмотра) с сервера.
  • POST – Отправляет/Создает новую информацию в базе данных Сервера.
  • PUT – Редактирует/Обновляет информацию в базе данных или добавляет ее, если ее еще нет.
  • УДАЛИТЬ – Удаляет информацию из базы данных Сервера.

Хорошо, теперь, когда мы знаем методы, давайте поймем, когда использовать каждый из них. Рассмотрим следующий пример:

У нас есть база данных студентов, содержащая такую информацию, как Имена, Класс, Возраст и т. Д.

  • Чтобы посмотреть список студентов – используйте метод GET HTTP
  • Чтобы добавить новую информацию о студенте – Используйте POST HTTP метод
  • Для редактирования определенной информации( Класс/Возраст) учащегося – Используйте Метод PUT HTTP
  • Чтобы удалить информацию о студенте из базы данных – используйте метод DELETE HTTP

Что такое REST API?

API REST ( Передача репрезентативного состояния ) аналогичен стандартному API. Здесь, когда мы отправляем запрос серверу, в отличие от API, который отвечает данными, REST API отвечает ресурсами .

Ресурсы REST API

Итак, что такое ресурсы ??

Ну, ресурсы-это данные, но то, как мы их видим, меняется. Ресурсы аналогичны объектно-ориентированному программированию. Давайте разберемся в этом на следующем примере:

Рассмотрим вид колбы – “/Book/Book123”

Здесь одна и та же конечная точка представления может выполнять 4 действия.

  • GET Book/Book 123: Показывает информацию о ” Book 123.
  • СООБЩЕНИЕ Книга/Книга 123 : Создает новую книгу “Книга 123.”
  • PUT Book/Книга 123 : Обновляет/редактирует информацию о книге “Книга 123.”
  • УДАЛИТЬ Книгу/Книгу 123: Удаляет “Книгу 123” из базы данных

Поскольку один объект имеет несколько функциональных возможностей( методы ООП), его можно рассматривать как ресурс Book.

Таким образом, теперь взаимодействие между Клиентом и сервером осуществляется не с отдельными запросами конечных точек, а с ресурсами (с одной и той же конечной точкой для разных действий)

Безгражданство REST API

Еще одной особенностью REST API является его безгражданство. Это означает, что после того, как сервер выполнит одно действие, он забудет об этом.

Давайте разберемся в этом на примере.

Рассмотрим Книжный ресурс, который мы видели выше. Допустим, я отправляю данные о Книге…” Краткая история Времени ” Стивен Хокингс, используя метод POST.

Сервер добавит эту информацию в базу данных, а затем забудет об этом действии. Это будет в следующий раз, когда я использую запрос GET для извлечения Книги; сервер не будет иметь памяти о предыдущем действии метода POST.

Сервер сначала зайдет в базу данных и выполнит поиск Книги. И как только он найдет Книгу, он ответит этими данными. Опять же, после того, как он завершит действие, он забудет об этом.

Использование JSON во взаимодействии API Клиент-сервер

API используют формат JSON для приема и возврата запросов .

То есть клиент отправляет данные запроса на сервер в виде текста JSON. Аналогично, сервер обрабатывает данные и снова возвращает ответ в виде текста JSON.

Таким образом, весь процесс создания веб-приложения на основе REST API выглядит следующим образом:

  • Пользователь отправляет данные запроса на сервер в формате JSON.
  • Сервер сначала преобразует JSON в формат, читаемый на python.
  • Затем сервер обрабатывает запрос и снова создает данные ответа в виде JSON
  • Затем шаблон веб-страницы преобразует ответ JSON в удобный для пользователя формат и отображает его на веб-странице.

Таким образом, реальный обмен информацией между клиентской стороной (FRONT-END) и сервером (BACKEND) в API происходит с использованием текста JSON.

Формат JSON похож на словарь Python:

{
    'student1':{
        'name':'XYZ',
        'age' : 21
    }
}

Установка ПОЧТАЛЬОНА

Postman-это платформа совместной работы для разработки API. Функции Postman упрощают каждый шаг создания API и упрощают совместную работу, чтобы вы могли создавать лучшие API—быстрее.

Нажмите здесь, чтобы загрузить ПОЧТАЛЬОН . Как только он будет установлен, он будет выглядеть следующим образом:

Окно ПОЧТАЛЬОНА

Ладно, программисты! Хватит читать, давайте теперь начнем создавать наш REST API.

Создание приложения Flask REST API

В этом разделе мы создадим простое приложение REST API для книг, используя библиотеку Flask RESTful . Так что давайте начнем !!

1. Установка Flask_restful в вашу систему

Чтобы установить пакет Flask_Restful, выполните команду pip:

pip install flask_restful

Теперь, когда он установлен, давайте перейдем к части базы данных

2. Кодирование моделей БД с помощью SQLAlchemy

Здесь мы будем использовать базу данных SQLite для хранения наших моделей. Чтобы использовать их, сначала установите flask_sqlalchemy

pip install flask_sqlalchemy

Теперь создайте models.py файл и добавьте следующий код

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class BookModel(db.Model):
    __tablename__ = 'books'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    price = db.Column(db.Integer())
    author = db.Column(db.String(80))

    def __init__(self, name, price, author):
        self.name = name
        self.price = price
        self.author = author 
    
    def json(self):
        return {"name":self.name, "price":self.price, "author":self.author}

Здесь Модель книги имеет поля имя, цена и автор. Поскольку API находятся в JSON, мы создаем метод объекта .json() для возврата объекта книги JSON.

Сначала мы должны создать экземпляр экземпляра БД, чтобы создать модель БД. Ознакомьтесь с нашим учебником по SQLAlchemy, если у вас есть какие-либо сомнения относительно SQLAlchemy.

Теперь, когда у нас есть наши модели, давайте теперь закодируем основное приложение Flask.

3. Кодирование приложения колбы

Для API REST Flask нам нужно включить дополнительный экземпляр API(app) , чтобы указать Flask, что это веб-приложение REST API.

from flask import Flask
from flask_restful import Api

app = Flask(__name__)

api = Api(app) #Flask REST Api code 

if __name__ == '__main__':
    app.run(host='localhost', port=5000)

Затем нам нужно предоставить информацию SQLite в SQLAlchemy и связать экземпляр БД (из моделей.py) с этим файлом приложения.

Поэтому для этого добавьте код:

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db.init_app(app)

Здесь замените именем, которое вы хотите для своей базы данных.

SQLALCHEMY_TRACK_MODIFICATIONS сохраняется False просто для простоты.

Третья строка связывает экземпляр БД с приложением. Нам нужен файл БД на месте, чтобы пользователи веб-страниц могли его использовать. Кроме того, мы требуем этого до самого первого запроса пользователя.

Поэтому для создания файла мы используем функцию:

@app.before_first_request
def create_table():
    db.create_all()

Добавьте это под самими приведенными выше кодами. Хорошо, с этим на месте, давайте закодируем наши классы ресурсов API REST Flask.

4. Добавление ресурса списка книг

Этот ресурс будет выполнять следующие действия:

  • Метод GET: Показать список книг в БД
  • Метод ПУБЛИКАЦИИ: Добавьте новую информацию о книге в базу данных

Таким образом, код будет выглядеть следующим образом:

class BooksList(Resource):
    def get(self):
        #get all objects from BookModel
        #return the JSON text of all objects
        pass
        
    def post(self):
        #convert the JSON data sent by the user to python-format
        #create a new bookModel object and send in the data
        #save to DB
        pass

Таким образом, код должен быть в состоянии выполнять задачи, написанные выше. Теперь давайте заменим комментарии фактическим кодом:

class BooksList(Resource):
    def get(self):
        books = BookModel.query.all()
        return {'Books':list(x.json() for x in books)}

    def post(self):
        data = request.get_json()
        new_book = BookModel(data['name'],data['price'],data['author'])
        db.session.add(new_book)
        db.session.commit()
        return new_book.json(),201

Здесь в методе GET,

  • Получите книги, присутствующие в БД, используя Модель книги.запрос.все()
  • Отображение JSON – текста книги один за другим в виде списка

В методе POST,

  • Преобразуйте данные JSON, используя request.get_json()
  • Создайте и добавьте новую информацию о книге в базу данных

Вот и все; наконец, нам нужно упомянуть конечную точку URL для ресурса Списка книг

api.add_resource(BooksView, '/books')

5. Добавление книжного ресурса

Теперь мы создадим ресурс, который будет:

  • Метод ПОЛУЧЕНИЯ: Отображение только определенной книги, запрошенной пользователем
  • Метод PUT: Отредактируйте информацию о конкретной книге. Если его нет, создайте его
  • Метод УДАЛЕНИЯ: Удалите конкретную книгу

Здесь код будет выглядеть следующим образом:

class Book(Resource):
    def get(self,name):
        #get the book with the name given by the user
        #if book exists, return it else return 404 not found 

    def put(self,name):
        #convert the JSON data sent by the user to python-format
        #Search if the book exists
        #if it exists, update it with the data given by the user 
        #if does not exists, create and add the book into DB

    def delete(self,name):
        #Search if the book exists in the DB
        #delete it

Код должен быть способен выполнять все вышеперечисленные задачи. Так что добавьте код:

class Book(Resource):
    def get(self,name):
        book = BookModel.query.filter_by(name=name).first()
        if book:
            return book.json()
        return {'message':'book not found'},404

    def put(self,name):
        data = request.get_json()

        book = BookModel.query.filter_by(name=name).first()

        if book:
            book.price = data["price"]
            book.author = data["author"]
        else:
            book = BookModel(name=name,**data)

        db.session.add(book)
        db.session.commit()

        return book.json()

    def delete(self,name):
        book = BookModel.query.filter_by(name=name).first()
        if book:
            db.session.delete(book)
            db.session.commit()
            return {'message':'Deleted'}
        else:
            return {'message': 'book not found'},404

Здесь в методе GET,

  • Модель книги.query.filter_by(name=name).first() возвращает первую книгу, полученную из БД. Он возвращает None, если ничего с именем не было найдено.
  • Возвращает текст книги в формате JSON, если он найден. Или же возвращает 404

Способ ввода,

  • Преобразуйте данные JSON с помощью request.get_json()
  • Найдите книгу с таким названием.
  • Если существует, замените старые данные новыми отправленными данными
  • Или же создайте новый объект книги
  • Добавьте его в базу данных

В методе УДАЛЕНИЯ,

  • Получите книгу с именем, указанным пользователем
  • Удалите его

Вот и все. Наконец добавьте конечную точку URL для этого ресурса

api.add_resource(BookView,'/book/')

И мы закончили !!

Окончательный код приложения Flask Rest API

Поэтому основное применение комбинированной колбы приведено ниже:

from flask import Flask,request
from flask_restful import Api, Resource, reqparse
from models import db, BookModel

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

api = Api(app)
db.init_app(app)

@app.before_first_request
def create_table():
    db.create_all()


class BooksView(Resource):
    '''
    parser = reqparse.RequestParser()
    parser.add_argument('name',
        type=str,
        required=True,
        help = "Can't leave blank"
    )
    parser.add_argument('price',
        type=float,
        required=True,
        help = "Can't leave blank"
    )
    parser.add_argument('author',
        type=str,
        required=True,
        help = "Can't leave blank"
    )'''

    def get(self):
        books = BookModel.query.all()
        return {'Books':list(x.json() for x in books)}

    def post(self):
        data = request.get_json()
        #data = BooksView.parser.parse_args()

        new_book = BookModel(data['name'],data['price'],data['author'])
        db.session.add(new_book)
        db.session.commit()
        return new_book.json(),201


class BookView(Resource):
    '''
    parser = reqparse.RequestParser()
    parser.add_argument('price',
        type=float,
        required=True,
        help = "Can't leave blank"
        )
    parser.add_argument('author',
        type=str,
        required=True,
        help = "Can't leave blank"
        )'''

    def get(self,name):
        book = BookModel.query.filter_by(name=name).first()
        if book:
            return book.json()
        return {'message':'book not found'},404

    def put(self,name):
        data = request.get_json()
        #data = BookView.parser.parse_args()

        book = BookModel.query.filter_by(name=name).first()

        if book:
            book.price = data["price"]
            book.author = data["author"]
        else:
            book = BookModel(name=name,**data)

        db.session.add(book)
        db.session.commit()

        return book.json()

    def delete(self,name):
        book = BookModel.query.filter_by(name=name).first()
        if book:
            db.session.delete(book)
            db.session.commit()
            return {'message':'Deleted'}
        else:
            return {'message': 'book not found'},404

api.add_resource(BooksView, '/books')
api.add_resource(BookView,'/book/')

app.debug = True
if __name__ == '__main__':
    app.run(host='localhost', port=5000)

В models.py файл:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class BookModel(db.Model):
    __tablename__ = 'books'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    price = db.Column(db.Integer())
    author = db.Column(db.String(80))

    def __init__(self, name, price, author):
        self.name = name
        self.price = price
        self.author = author 
    
    def json(self):
        return {"name":self.name, "price":self.price, "author":self.author}

Давайте теперь запустим наш сервер и проверим их с помощью почтальона.

Реализация приложения Flask REST API с помощью POSTMAN

Запустите сервер и перейдите к ПОЧТАЛЬОНУ.

1. Ресурс списка книг: Метод публикации

Перейдите в конечную точку ” /книги ” с помощью метода POST

В теле выберите raw – JSON и добавьте данные JSON в тело

{
	"name":"book1",
	"price":123,
	"author":"author1"
}

Нажмите отправить

ПОСТ

Создается книга – book1

2. Ресурс списка книг: Метод публикации

Перейдите в раздел ” книги/ ” с помощью метода GET и нажмите кнопку отправить. Вы получите список книг в БД

ПОЛУЧИТЬ

Поскольку у нас есть только книга 1 , она показывает только 1 объект в списке.

3. Книжный ресурс: метод ПОЛУЧЕНИЯ

Теперь перейдите в “/books/ book1 ” с помощью GET и нажмите отправить

ПОЛУЧИТЬ

Смотрите, он показывает информацию из книги 1

4. Книжный ресурс: метод PUT

Перейдите в “/books/ book 1 “, используя метод PUT, и в теле добавьте следующий JSON.

{
	"price": 100,
	"author":"author123"
}

Поскольку имя уже отправлено через URL-запрос, нам нужно отправить цену и автора JSON.

Нажмите отправить

КЛАСТЬ

Цена и авторские ценности изменились !! Попробуйте также проверить их с помощью метода GET.

5. Ресурс книги: метод УДАЛЕНИЯ

Перейдите в раздел “/книги/ книга 1 “, используя метод УДАЛЕНИЯ

УДАЛИТЬ

Смотрите, он удален!

Вывод

Вот и все, ребята! Я надеюсь, что вы получили достаточно знаний о фреймворке REST API Flask. Попробуйте сами приведенные выше коды для лучшего понимания.

Увидимся, ребята, в следующий раз !!