Мы собираемся настроить платформу API Falcon на Docker. Таким образом, мы сможем построить наши API. Есть 2 вида рамок, полнофункциональные и голые рамки. Если вы предпочитаете разработать RESTFUL API для своих проектов с Python, в целом вы считаете структуру следующую.
1) Колбу с хрупкой
2) Django + Rest Framework
С другой стороны, в Python есть очень хорошая световая структура API, называемое Сокол Анкет
Соответственно, Falcon утверждает (я согласен с ними), другие рамки оттачивают вас с тоннами зависимостей и ненужных абстракций. Сокол проходит до погони с чистым дизайном, который охватывает HTTP и остальный архитектурный стиль.
Дружелюбное напоминание В этой статье мы увидим корректировку и установку Сокола на Docker. Мой следующий пост продемонстрирует, чтобы построить API с Falcon.
Ну, давайте начнем. Первоначально мы должны изменить структуру каталога. Это должно быть так.
Во -первых, я собираюсь поделиться Docker-compose.yml Файл в корневой каталог.
version: '2' services: backend: build: ./backend ports: - "9000:8000" volumes: - ./app/.:/app tty: true depends_on: - postgresql postgresql: image: postgres:alpine environment: POSTGRES_DB: test_dev POSTGRES_USER: mertingen POSTGRES_PASSWORD: mertingen ports: - '5432:5432'
Как вы можете видеть, в качестве решения базы данных я имею в виду PostgreSQL. После того, как вы создаете этот файл, он будет создан базой данных под названием test_dev и пользователь Мертинген называется. Также наше приложение раскрывает 9000 порт для подачи снаружи.
В каталоге базы данных у меня один файл. Давайте посмотрим на Dockerfile.
FROM postgres:10.1-alpine
На данный момент я просто вытащил изображение. Поэтому мы сможем подключить базу данных, и мы отправим эти переменные среды в файле Docker-compose.yml. Мы собираемся запустить этот файл тогда. В справочном каталоге у меня 2 файла Dockerfile и start.sh. Давайте посмотрим на них.
FROM python:3.6.2 COPY start.sh /scripts/start.sh WORKDIR /app ENTRYPOINT ["/scripts/start.sh"]
И вот start.sh.
#!/bin/bash pip install --upgrade pip pip install -r /app/requirements.txt gunicorn app:api -c /app/conf/gunicorn_conf.py --reload
Вы можете найти Требования.txt здесь.
attrs==19.1.0 falcon==2.0.0 falcon-autocrud==1.0.36 gunicorn==19.9.0 jsonschema==3.0.1 marshmallow==2.19.5 psycopg2==2.8.3 pyrsistent==0.15.4 python-dateutil==2.8.0 six==1.12.0 SQLAlchemy==1.3.6 webargs==5.4.0
start.sh Файл устанавливает зависимости и создает сервер для запуска приложения. Чтобы обслуживать приложение, я создаю 2 файла конфигурации, config.ini и Gunicorn_conf.py В каталоге конфуза. Это config.ini файл.
[postgresqlDB] host = postgresql db = test_dev user = mertingen pass = mertingen
Чтобы подключить базу данных, мы будем использовать этот файл. Параметры будут переменными среды в моей следующей статье. Этот файл помогает подключиться к базе данных.
import psycopg2 import configparser import os dir_path = os.path.dirname(os.path.realpath(__file__)) config = configparser.ConfigParser() config.read(dir_path + '/../conf/config.ini') def connect(): try: connection = psycopg2.connect(user=config['postgresqlDB']['user'], password=config['postgresqlDB']['pass'], host=config['postgresqlDB']['host'], port="5432", database=config['postgresqlDB']['db']) print("You are connected!") return connection except (Exception, psycopg2.Error) as error: print("Error while connecting to PostgreSQL", error) # finally: # if connection: # connection.close() # print("PostgreSQL connection is closed")
Теперь я делюсь конфигурацией Сервер стрелков Анкет
import multiprocessing bind = '0.0.0.0:8000' workers = multiprocessing.cpu_count() * 2 + 1 timeout = 30 worker_connections = 1000
Нам едва нужно создать приложение Falcon. Для этого давайте создадим app.py и поместите этот код.
import falcon from resources import user from services import database #from middlewares import ( # ContentEncodingMiddleware, #) conn = database.connect() #api = falcon.API(middleware=[ # ContentEncodingMiddleware(), #]) api = falcon.API() user = user.User(conn) api.add_route('/users/{id}', user) api.add_route('/users', user, suffix='collection')
Проще говоря, чтобы увидеть ответ из этого API, я создаю файл ресурса пользователя в каталоге ресурсов. Это вот так.
import falcon def __init__(self, conn): self.conn = conn @staticmethod def set_columns(data, cursor): items = [] for x in data: item = {} c = 0 for col in cursor.description: item.update({col[0]: x[c]}) c = c + 1 items.append(item) return items def on_get_collection(self, req, resp): try: cursor = self.conn.cursor() query = """SELECT * FROM Users""" cursor.execute(query) records = cursor.fetchall() cursor.close() output = {"status": True, "message": None, 'data': self.set_columns(records, cursor)} resp.status = falcon.HTTP_200 resp.body = output except Exception as error: output = {"status": False, "message": str(error), "data": None} resp.status = falcon.HTTP_500 resp.media = output
На самом деле, я не упоминаю коды, так как я сказал, что мы собираемся построить API в следующей статье. Я вставил некоторые фальшивые пользовательские данные, и приложение возвращает данные.
Отныне нам просто нужно запустить службы Docker Compose с этой командой в корневом каталоге.
docker-compose up --build
В результате вы получите такой вывод.
После этого, пока вы просите http://localhost: 9000/users URL, вы сможете получить этот результат. Как я уже сказал, я играл с поддельными данными.
Подводить итоги
Спасибо всем за чтение до этого момента. Docker помогает создать ваше рабочее пространство разработки, и мы должны использовать его функции таким образом. Аналогично, Falcon Framework создает довольно крутые API. Я надеюсь, что эта статья будет полезна для вас и увидит вас в следующей статье. Если у вас есть какие -либо проблемы, не стесняйтесь спрашивать.
Оригинал: “https://dev.to/_mertsimsek/falcon-api-framework-on-docker-5eid”