Давайте создадим приложение 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 завершены.
Следующая часть: