Давайте создадим приложение CRUD с Sanic

1. Что такое Sanic?

Sanic - это веб-сервер и веб-фреймворк Python 3.7+, написанные для быстрой работы. Он позволяет использовать синтаксис async / await, добавленный в Python 3.5, что делает ваш код неблокирующим и быстрым.

Цель: предоставить простой способ запустить и запустить высокопроизводительный HTTP-сервер, который легко построить, расширить и, в конечном итоге, масштабировать.

Функции

  • Встроенный быстрый веб-сервер
  • Готово к производству
  • Высокая масштабируемость
  • Соответствует ASGI
  • Простой и интуитивно понятный дизайн API
  • Сообществом, для сообщества

2. Как сделать Sanic

В этом руководстве мы создадим Restful API с помощью Sanic. Форматы данных REST API включают приложение / JSON.

Предварительные требования:

  • Python 3.7+
  • Почтальон / Бессонница
  • Ваш предпочтительный редактор кода, я буду использовать VS Code и Pycharm Community Edition

3. Настройка проекта

Прежде чем запачкать руки, нам нужно настроить наш проект.

Следующие шаги выполняются для настройки проекта.

Создать новый проект

Создайте каталог проекта с именем Learnsanic и войдите в папку.

Настроить виртуальную среду

Чтобы изолировать каждую среду разработки, мы будем использовать виртуальную среду.

Перед созданием виртуальной среды нам необходимо убедиться, что у нас установлен virtualenv. Для этого выполните следующее:

virtualenv --version

Если мы получим ошибку, выполните следующее:

pip install virtualenv

Теперь снова выполните:

virtualenv --version

И вы можете увидеть версию вашей виртуальной среды.

Теперь создайте виртуальную среду с именем venv, выполнив следующую команду:

virtualenv venv

После создания виртуальной среды новый каталог можно визуализировать, выполнив в терминале следующую команду:

ls

После создания виртуальной среды активируйте виртуальную среду, выполнив следующую команду:

source venv/bin/activate

Теперь вы видите, что в терминале активирована ваша виртуальная среда:

Установите необходимые пакеты

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

Чтобы установить пакет sanic в нашей виртуальной среде с помощью диспетчера пакетов pip, выполните следующую команду:

pip install sanic

Создайте файл app.py

Выполните следующее:

touch app.py 

И откройте файл в предпочитаемом вами редакторе. Если вы используете VSCode, выполните следующую команду:

code app.py 

Настроить среду

Сначала создайте экземпляр нашего приложения Sanic.

Для этого импортируйте Sanic и создайте экземпляр следующим образом:

4. Разработка RESTful API

Перед разработкой API сообщите нам, что мы создаем.

Наша школа планирует создать RESTful API с использованием Sanic, чтобы они могли добавлять, получать и обновлять сведения о своих учениках. Первоначально мы сосредоточимся на базе данных в памяти, то есть рассматриваем переменную как базу данных, а позже мы перейдем к реальной базе данных SQL.

Наша школа хочет иметь подробную информацию об учениках, и поля изначально содержат имя, оценку, список, адрес электронной почты, телефон, предметы, друзей.

Давайте создадим нашу базу данных в памяти, предоставим данные в формате словаря и сохраним их в переменной in_memory_student_db, как показано на рисунке.

Чтобы получить только что созданные данные, т. Е. in_memory_student_db.

Создайте метод получения.

@app.get("/")
async def get_student(request):
    return in_memory_student_db

Если вам интересно, что такое @app.get(“/”), то их называют декораторами.

Чтобы получить ответ, мы просто создадим функцию get_student, как указано выше, и запустим приложение sanic:

sanic app.app

Это запустит ваш сервер, и когда вы попадете на маршрут в бессоннице, вы получите ошибку, как указано ниже:

Sanic.exceptions.ServerError: Invalid response type (need HTTPResponse)

Здесь упоминается, что мы не можем вернуть наш список словарей, тип возврата должен быть HTTPResponse. Для этого мы импортируем ответ из sanic:

from sanic import response
---
---
async def get_student(request):
    return response.json(in_memory_student_db)
---
---

@app.post("/")
async def post_student(request):
    student = request.json
    in_memory_student_db.append(student)
    return response.json(student)

Аналогично пишем программу для обновления и удаления:

@app.put("/<id_:int>")
async def update_student(request,id_):
    student = request.json
    in_memory_student_db[id_] = student
    return response.json(student)

@app.delete("/<id_:int>")
async def delete_student(request,id_):
    del in_memory_student_db[id_]
    return response.json({"message":"Deleted student successfully"})

На этом завершается простейшая версия нашей операции CRUD в Sanic. Но достаточно ли этого?

  • Что, если мы хотим получить данные, если база данных пуста?
  • что, если мы хотим обновить студента, которого нет в базе данных?
  • Что, если мы хотим удалить студента, которого нет в базе данных?
  • Что, если мы хотим получать данные по идентификатору, а не целые данные?

Теперь переделаем функции следующим образом:

Чтобы получить данные по идентификатору или целые данные, измените функцию get следующим образом:

@app.get("/")
async def get_student(request):
    id_ = request.args.get("id")
        if id_:
            if int(id_) in range(len(in_memory_student_db)):
                return response.json(in_memory_student_db[int(id_)])
            else:
                return response.json(
                    {
                    "status": "error",
                    "message": f"data with id {id_} not found. Try with different id!!!"
                    }
                )
    return response.json(in_memory_student_db)

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

@app.put("/<id_:int>")
async def update_student(request,id_):
    student = request.json
    if id_ in range(len(in_memory_student_db)):
        in_memory_student_db[id_] = student
    else:
        return response.json({"error":"No Student with given id"})
    return response.json(student)

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

@app.delete("/<id_:int>")
async def delete_student(request,id_):
    if id_ in range(len(in_memory_student_db)):
        del in_memory_student_db[id_]
    else:
        return response.json({"error": "No Student with given id"})
    return response.json({"message": "Deleted student successfully"})

На этом операции CRUD завершены.

Следующая часть: