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

Falcon API Framework на Docker

Мы собираемся настроить платформу API Falcon на Docker. Таким образом, мы сможем построить наши API. С тегом WebDev, Python, Docker, новичками.

Мы собираемся настроить платформу 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”