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

Построить API отдыха с колбу и SQLALCHEMY

Flask – отличная структура, которая позволяет быстро строить веб-приложения с Python. Это быстро, маленькое и весело работать с. В этом…

Автор оригинала: Rahman Fadhil.

Flask – отличная структура, которая позволяет быстро строить веб-приложения с Python. Это быстро, маленькое и весело работать с. В этом руководстве мы собираемся построить спокойную API с флум для флэки, а также некоторые другие инструменты поддержки.

Цель этого учебника – понять концепцию построения сервера колба с нуля, узнать, как промежутку в связи с базами данных SQL через объект-реляционный Mapper, а также дизайн RESTFLAY API с объектно-ориентированным рисунком дизайна.

К концу этого урока вы сможете создать API для отдыха, которые могут управлять сообщениями по записям в блоге с созданием функциональности, чтения, обновления и удаления.

Начиная

Я опубликовал готовый проект этого учебника на моем Github, вы можете проверить это здесь или клонировать его в вашу машину, запустив команду ниже.

$ git clone https://github.com/rahmanfadhil/flask-rest-api.git

Затем создайте новую виртуальную среду Python и установите зависимости с PIP.

$ python -m venv env
$ source env/bin/activate
(env) $ pip install -r requirements.txt

Зависимости

Согласно его документации, колба представляет собой микро-каркас. Это означает, что в отличие от любых других веб-каркасов, колба не приходит с большим количеством модных вещей из коробки.

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

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

Вот некоторые сторонние пакеты, которые мы будем использовать для создания наших API:

  • Колбу sqlalchemy : Расширение колбы, которое добавляет поддержку для SQLalchemy , объектно-реляционный Mapper, который облегчает взаимодействие с базами данных SQL.
  • Флэбская спокойная : Еще одно расширение колбы для быстрого создания API для отдыха с объектно-ориентированным рисунком дизайна.
  • Флэб-зефир : Еще одно расширение колбы, которое интегрируется с Зефир библиотека Python для сериализации объекта.

Флэк-проект с заземления

Мы можем начать наш проект, инициализируя новую виртуальную среду с Python Venv модуль.

$ python3 -m venv env
$ source env/bin/activate

Во-вторых, установите наши мы можем установить наши зависимости через PIP, запустив эту команду.

$ pip install Flask \
    Flask-SQLAlchemy \
    Flask-RESTful \
    flask-marshmallow

Наконец, создайте новый файл Python под названием main.py (или все, что вы хотите назвать его). Здесь мы настроим наш новый сервер Flask.

from flask import Flask app = Flask( __name__ ) if __name__ == ' __main__': app.run(debug=True)

Чтобы проверить его, мы можем выполнить наш сценарий Python с помощью команды ниже.

Открыть http://localhost: 5000 , и вы увидите страницу 404.

Настройка базы данных

Здесь мы собираемся использовать базу данных SQL для хранения данных в нашем блоге.

Для учебных целей я собираюсь использовать SQLite , небольшая реализация базы данных SQL, которая очень легко вставать и бежать. Имейте в виду, что вы можете рассмотреть более надежную базу данных, такую как PostgreSQL или MySQL в производственной среде.

Чтобы настроить SQLALCHEMY в колбе-проекте, мы можем импортировать FLASK_SQLALCHEMY Пакет (который мы установили ранее), и заверните нашу колбу приложение Переменная в новом SQLalchemy объект. Мы также хотим настроить Sqlalchemy_database_uri В нашей конфигурации приложения Flask, чтобы указать, какую базу данных мы хотим использовать и как к ней получить доступ.

from flask import Flask
from flask_sqlalchemy import SQLAlchemy app = Flask( __name__ )
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' db = SQLAlchemy(app) if __name__ == ' __main__': app.run(debug=True)

Модель базы данных

Модель – это не что иное, как представление вашей базы данных, где вы можете хранить, получить, и манипулировать своими данными из него. Подумайте об этом как об этом как посредник вашего приложения и базы данных. И его обычно представляет собой одну таблицу/коллекцию.

Это позволяет вам сделать все для этого конкретного стола непосредственно из вашего кода Python. Так что вам больше не нужно связываться с SQL-запросами.

Давайте создадим модель, которая представляет наши данные по сообщениям блога.

class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(50)) content = db.Column(db.String(255)) def __repr__ (self): return '' % self.title

Здесь у нас есть ID Свойство, которое является автоматическим сгенерированным первичным ключом. Тогда у нас также есть Название и Содержание Поле, просто обычное строковое поле с максимальной длиной.

Эта часть необязательна, но, чтобы убедиться, что все очевидно, мы можем установить __repr__ Метод для создания каждого объекта одного поступления печатается на консоль.

Затем нам нужно настроить схему для нашей модели. Это необходимо, потому что мы хотим разобрать наш почтовый объект (ы) в ответ JSON. В этом случае мы можем использовать flask_marshmallow упаковка.

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow app = Flask( __name__ )
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
ma = Marshmallow(app) if __name__ == ' __main__': app.run(debug=True)

Создайте новую схему зефир, основанную на наших Пост модель.

class PostSchema(ma.Schema): class Meta: fields = ("id", "title", "content") post_schema = PostSchema()
posts_schema = PostSchema(many=True)

В этой схеме мы можем выбрать, какие поля, чтобы разоблачить нашим пользователям. Если у вашей модели есть некоторые конфиденциальные данные, вы можете исключить его здесь. Тогда мы также создали его в post_schema и post_schema Отказ Использовать post_schema для сериализации массива постов. В противном случае используйте post_schema Отказ

Следующая важная часть, которую обычно забывают большинство людей (включая себя), – это инициализировать нашу схему базы данных, вызывая db.create_all Функция из нашего экземпляра Sqlachemy внутри интерактивной оболочки Python (REPL). Причина, по которой мы делаем это в репреире, заключается в том, что нам нужно только один раз инициализации нашей схемы.

Кроме того, убедитесь, что вы находитесь в правой среде Python.

(env) $ python
>>> from main import db
>>> db.create_all()
>>> exit()

Редкие маршруты

Наконец, мы можем начать определять наш редкий обработчик. Мы воспользуемся вспомогательным пакетом Flask-Restful, набор инструментов, которые помогают нам построить спокойные маршруты с объектно-ориентированным дизайном.

Нам нужно настроить Plask-redful Direction, чтобы встать и запустить на нашем сервере Flask.

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_restful import Api, Resource app = Flask( __name__ )
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
api = Api(app) if __name__ == ' __main__': app.run(debug=True)

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

class PostListResource(Resource): def get(self): posts = Post.query.all() return posts_schema.dump(posts) api.add_resource(PostListResource, '/posts')

Здесь мы принимаем Получить Запрос и сделать запрос для получения всех сообщений с Пост модель. Тогда мы пользуемся post_schema Для сериализации данных из базы данных и вернуть ее в ответ на клиента.

Наконец, мы регистрируем наш ресурс, используя API.ADD_RESORCE Способ и определите конечную точку руту.

Запустите сервер, отправьте запрос на Posts Конечная точка, и вы получите пустой массив.

$ curl http://localhost:5000/posts
[]

Cool, теперь пришло время работать с созданием операции.

from flask import Flask, request class PostListResource(Resource): def get(self): posts = Post.query.all() return posts_schema.dump(posts) def post(self): new_post = Post( title=request.json['title'], content=request.json['content'] ) db.session.add(new_post) db.session.commit() return post_schema.dump(new_post)

Мы создаем новый пост Метод в нашем ресурсе, создает новый объект поступления с данными запроса и сохранить запись в базу данных. Наконец, мы возвращаем данные поста в качестве ответа на клиента.

Попробуйте отправить запрос на пост /Тодос Конечная точка с почтовыми данными.

$ curl http://localhost:5000/posts \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"title":"Post 1", "content":"Lorem ipsum"}'
{
    "content": "Lorem ipsum",
    "id": 1,
    "title": "Post 1"
}

Давайте создадим новый ресурс для получения индивидуального поста.

class PostResource(Resource): def get(self, post_id): post = Post.query.get_or_404(post_id) return post_schema.dump(post) api.add_resource(PostResource, '/posts/')

Здесь мы также приняли Получить Запрос, но вместо того, чтобы запрашивать все сообщения, мы просто внесите один пост с данным ID. Если это не существует, он поднимет ошибку 404.

Попробуйте получить /TODOS/ , и вы получите сообщение, которое мы только что создали.

$ curl http://localhost:5000/posts/1
{
    "title": "Post 1",
    "content": "Lorem ipsum",
    "id": 1
}

И, если вы запрашиваете сообщение с идентификатором, который не существует, вы получите ошибку 404.

$ curl http://localhost:5000/posts/12 -I
HTTP/1.0 404 NOT FOUND
...

Теперь давайте добавим оставшиеся операции CRUD, обновить и удалить.

class PostResource(Resource): def patch(self, post_id): post = Post.query.get_or_404(post_id) if 'title' in request.json: post.title = request.json['title'] if 'content' in request.json: post.content = request.json['content'] db.session.commit() return post_schema.dump(post) def delete(self, post_id): post = Post.query.get_or_404(post_id) db.session.delete(post) db.session.commit() return '', 204

В патч Сначала мы сначала получим объект пост, если существовать, мы обновляем свойства, которые определены в корпусе запроса ( request.json ). Вот почему нам нужно проверить оба свойства с в выражение. Сохраните изменения в базе данных, используя db.session.commit () и отправьте данные обновления клиенту.

В Удалить Метод, мы также получаем почтовый объект. Но на этот раз мы просто удалите объект с Удалить Способ от почтового объекта. Сохраните изменения и ничего не верните к клиенту (потому что нечего отображать).

Теперь у нас есть все функциональные возможности и работает, давайте проверим его!

Обновить сообщение:

$ curl http://localhost:5000/posts/1 \
    -X PATCH \
    -H "Content-Type: application/json" \
    -d '{"title":"Updated Post", "content":"Updated post content"}'
{
    "content": "Updated post content",
    "id": 1,
    "title": "Updated Post"
}

Удалить сообщение:

$ curl http://localhost:5000/posts/1 -X DELETE -I
HTTP/1.0 204 NO CONTENT
...