Статьи

Создание REST API с использованием EVE

Python является одним из самых простых для чтения и написания языков программирования всех времен. За прошедшие годы популярность Python только возросла, и он широко используется в разработке веб-приложений, создании сценариев, создании игр, научных вычислениях и т. Д.

Flask — это платформа веб-приложений Python, которая набирает популярность благодаря простоте использования для начинающих Python. В этом уроке мы рассмотрим EVE , инфраструктуру построения REST API, основанную на Flask , MongoDB и Redis. Из официальных документов:

При поддержке Flask, MongoDB, Redis и благих намерений Eve позволяет без особых усилий создавать и развертывать полностью настраиваемые, полнофункциональные веб-службы RESTful.

В этом уроке мы увидим, как создавать API REST с использованием инфраструктуры EVE. Далее, используя AngularJS, мы спроектируем интерфейс для простого приложения и сделаем его функциональным, используя API REST, созданные с использованием EVE. В этом уроке мы реализуем следующую функциональность:

  • Создать пользовательский API
  • Проверить пользовательский API
  • API Добавить товары
  • API удаления элементов
  • API обновлений элементов

Мы будем использовать pip для установки EVE.

1
pip install eve

Мы будем использовать MongoDB качестве базы данных. Посмотрите официальные документы для установки в соответствии с вашей системой.

Создайте папку проекта с именем PythonAPI . Перейдите к PythonAPI и создайте файл с именем api.py Внутри api.py импортируйте EVE и создайте объект EVE.

1
2
from eve import Eve
app = Eve()

Затем запустите app когда программа выполняется как основная программа.

1
2
3
4
5
from eve import Eve
app = Eve()
 
if __name__ == ‘__main__’:
    app.run()

Запустите ваш MongoDB используя следующую команду:

1
mongod —dbpath= <PATH-TO> /data/db/

Как видите, нам нужно указать путь к файлам БД. Просто создайте data/db в вашей файловой системе и выполните приведенную выше команду.

Наряду с запущенным экземпляром MongoDB , EVE требуется файл конфигурации с информацией о ресурсах API. Поэтому в папке PythonAPI создайте другой файл с именем settings.py и добавьте следующий код:

1
DOMAIN = {‘user’: {}}

Приведенный выше код информирует EVE, что ресурс для user доступен.

Сохраните все файлы и запустите api.py :

1
python api.py

API должен быть онлайн, как показано:

Python API работает на локальном порту 5000

Мы будем использовать REST-клиент Postman для отправки запросов к API. Это бесплатно и может быть установлено простым щелчком мыши. Закончив установку, запустите приложение, введите URL-адрес API ( http://127.0.0.1:5000/ ) и нажмите «Отправить». У вас должен быть ответ как показано:

Ответ на запуск приложения

Поскольку мы не вызывали какой-либо конкретный ресурс API, он покажет все доступные ресурсы. Теперь попробуйте вызвать user ресурс, и у вас должен быть ответ, специфичный для user .

Мы начнем с создания API для создания или регистрации пользователя для нашего приложения. У пользователя будут определенные поля, такие как First Name , Last Name , Username , Password и Phone Number .

Итак, сначала нам нужно определить схему для пользователя. Схема определяет поля и типы данных ключевых полей. Откройте файл settings.py и измените DOMAIN , определив схему, как показано ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
DOMAIN = {
    ‘user’: {
        ‘schema’: {
            ‘firstname’: {
                ‘type’: ‘string’
            },
            ‘lastname’: {
                ‘type’: ‘string’
            },
            ‘username’: {
                ‘type’: ‘string’,
                 ‘unique’: True
            },
            ‘password’: {
                ‘type’: ‘string’
            },
            ‘phone’: {
                ‘type’: ‘string’
            }
        }
    }
}

Как видно из приведенного выше кода, мы определили ключевые поля, необходимые для создания пользователя, и его тип данных, определенный в схеме. Сохраните изменения и выполните api.py От Postman Client попробуйте сделать запрос POST вместе с необходимыми параметрами для http://127.0.0.1/user, как показано:

POST запрос к пользователю

По запросу пользователя POST возникла ошибка 405 Method Not Allowed . По умолчанию EVE принимает только запросы GET. Если мы хотим использовать любой другой метод, мы должны определить его явно. Откройте settings.py и определите методы ресурса, как показано:

1
RESOURCE_METHODS = [‘GET’, ‘POST’]

Сохраните изменения и выполните api.py Теперь попробуйте снова POST для пользователя, и вы должны получить следующий ответ:

POST запрос к пользователю

Как вы можете видеть выше, запрос POST был успешным. Мы не определили конфигурации базы данных в нашем settings.py , поэтому EVE выполнила запрос, используя работающий экземпляр MongoDB . Давайте войдем в оболочку MongoDB и увидим вновь созданную запись. Запустив экземпляр MongoDB, запустите оболочку mongo:

1
mongo

Оказавшись внутри оболочки mongo , перечислите все доступные базы данных.

1
show databases;

Там должна быть база данных eve . Переключитесь на базу данных eve .

1
use eve;

Выполните команду show чтобы получить список таблиц в базе данных eve .

1
show tables;

В перечисленных таблицах должна быть таблица с именем user . Выведите список записей из user таблицы, используя следующую команду:

1
db.user.find()

Вот выбранные записи из пользовательских таблиц:

Выбранные записи из пользовательской таблицы

Далее мы создадим API для проверки существующего пользователя. Обычно, если мы делаем запрос get к конечной точке пользователя ( http://127.0.0.1:5000/user ), он выдаст сведения обо всех зарегистрированных пользователях из базы данных. Нам нужно реализовать две вещи здесь. Во-первых, нам нужно аутентифицировать пользователя, используя имя и пароль, а во-вторых, нам нужно вернуть данные пользователя из базы данных при успешной аутентификации.

Чтобы получить подробности, основанные на имени, нам нужно добавить дополнительное поле поиска в DOMAIN в settings.py .

1
2
3
4
‘additional_lookup’: {
           ‘url’: ‘regex(«[\w]+»)’,
           ‘field’: ‘username’,
           }

Как видно из приведенного выше кода, мы добавили поле поиска для username . Теперь, когда GET-запрос отправляется на http://127.0.0.1:5000/user/ <username> он возвращает информацию о пользователе с конкретным username . При отправке запроса конкретному пользователю мы также отправим username и password для аутентификации.

Мы будем выполнять базовую аутентификацию для проверки конкретного пользователя на основе имени пользователя и пароля. Во-первых, нам нужно импортировать класс Basic Auth из EVE. Создайте класс с именем Authenticate для реализации аутентификации, как показано:

1
2
3
4
5
from eve.auth import BasicAuth
 
class Authenticate(BasicAuth):
    def check_auth(self, username, password, allowed_roles, resource,
                   method):

Теперь, когда ресурс — user а метод запроса — GET , мы аутентифицируем пользователя. При успешной аутентификации будут возвращены пользовательские данные пользователя с именем в конечной точке API. Мы также ограничим создание пользователей, указав имя пользователя и пароль. Итак, если метод POST, а конечная точка API — пользователь, мы проверим и подтвердим имя пользователя и пароль. Итак, вот полный класс Authenticate :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
class Authenticate(BasicAuth):
   def check_auth(self, username, password, allowed_roles, resource,
                  method):
       if resource == ‘user’ and method == ‘GET’:
           user = app.data.driver.db[‘user’]
           user = user.find_one({‘username’: username,’password’:password})
           if user:
               return True
           else:
               return False
       elif resource == ‘user’ and method == ‘POST’:
           return username == ‘admin’ and password == ‘admin’
       else:
           return True

Нам нужно передать имя класса Authenticate при запуске API. Поэтому измените исходный код API, как показано ниже:

1
2
3
if __name__ == ‘__main__’:
   app = Eve(auth=Authenticate)
   app.run()

Сохраните все изменения и выполните api.py Попробуйте отправить базовый запрос авторизации с именем пользователя и паролем от Почтальона по адресу http://127.0.0.1/user/username (замените имя пользователя любым другим существующим именем пользователя). При успешной аутентификации вы должны получить данные пользователя в ответ, как показано ниже:

Подтвердить ответ API пользователя

Чтобы создать API для добавления элементов, все, что нам нужно сделать, — это создать новую схему для элемента в settings.py .

01
02
03
04
05
06
07
08
09
10
‘item’: {
       ‘schema’: {
           ‘name’:{
               ‘type’: ‘string’
               },
           ‘username’: {
               ‘type’: ‘string’
               }
           }
       }

API Add Item поможет каждому зарегистрированному пользователю добавить элемент. Мы будем сохранять элемент вместе с именем пользователя, который ввел элемент. Сохраните изменения и попробуйте выполнить запрос POST по адресу http://127.0.0.1/item, как показано:

Добавить элемент API запрос и ответ

Для удаления элемента, созданного пользователем, все, что нам нужно сделать, это вызвать конечную точку элемента /item_id . Но простой вызов запроса DELETE не удалит элемент. Чтобы удалить элемент, мы также должны предоставить _etag связанный с конкретным элементом. Как только item id и _etag совпадают, элемент удаляется из базы данных. Вот как метод DELETE вызывается в конечной точке элемента.

API Удалить элемент

API обновления аналогичен API удаления. Все, что нам нужно сделать, это отправить запрос PATCH с item id и _etag и полями формы, которые необходимо обновить. Вот как обновляются детали товара:

Обновить элемент API

В этом уроке мы увидели, как начать создавать API с использованием среды Python EVE . Мы создали несколько базовых API для операций CRUD, которые мы будем использовать в следующей части серии при создании приложения AngularJS.

Исходный код из этого урока доступен на GitHub .

Дайте нам знать ваши мысли в комментариях ниже!