Створюємо масштабований RESTFul API за допомогою Falcon та PyPy

8 хв. читання
14 листопада 2021

Всім привіт. Якщо ви створюєте RESTFul API для якоїсь цілі, який технічний стек ви використовуєте у Python і чому? Я можу отримати такі відповіді:

  1. Я використовую Flask разом з Flask-RESTFul

  2. Я використовую (Django + Tastypie) або (Django + REST Framework)

Обидві варіанти мені не підходять. Тому що є хороший та легкий API framework доступний у Python – Falcon. Я завжди тримаю мій проект та REST API слабо зв'язаними. Це означає, що мій REST API мало що знає про проект Django або Flask, який реалізується. Створення хмарних API з низькорівневим веб-фреймворком завжди прискорює мій API.

Що таке Falcon?

Згідно офіційному сайту Falcon.

"Falcon - це мінімалістична WSGI бібліотека для створення швидких веб API та бекенду додатка."

"Коли справа доходить до створення HTTP API інші фреймворки тягнуть вас вниз з тоннами залежностей і непотрібних абстракцій. Falcon переходить до найважливішого зі зрозумілим дизайном, який охоплює архітектурні стилі HTTP та REST."

Якщо ви хочете вдарити по "голому металу" для створення API, використовуйте Falcon. Ви можете створити легко розроблюваний, легко обслуговуваний та легко масштабований API за допомогою Falcon. Просто використовуйте його для швидкості.

Що таке PyPy?

"Якщо ви хочете, щоб ваш код працював швидше, ви, ймовірно, повинні просто використовувати PyPy." - Гвідо ван Россум

PyPy - це швидка, сумісна альтернативна реалізація мови Python.

Таким чином PyPy - це JIT реалізація для вашого Python коду. Це окремий інтерпретатор, який може бути використаний як звичайний інтерпретатор у віртуальному середовищі, щоб привести в дію наші проекти. У більшості випадків проблем з PyPy немає.

Давайте почнемо створення простого todo REST API

Примітка: Джерело проекту доступне на https://github.com/narenaryan/Falcon-REST-API-Pattern

Falcon та PyPy - це наші інгредієнти для створення масштабованого, швидкого REST API. Почнемо з віртуального середовища, яке виконує PyPy з falcon встановленим за допомогою pip. Потім ми використаємо rethinkDB в якості постачальника ресурсів для нашого API. Наш todo додаток робить три основні речі.

  1. Створює запис (PUT)

  2. Вибірка запису за ID (GET)

  3. Вибірка всіх записів (GET)

  4. PUT & DELETE – очевидні

Встановіть RethinkDB на Ubuntu14.04 таким чином.

$ source /etc/lsb-release && echo "deb http://download.rethinkdb.com/apt $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list
$ wget -qO- http://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add -
$ sudo apt-get update && sudo apt-get install rethinkdb
$ sudo cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/instance1.conf
$ sudo /etc/init.d/rethinkdb restart

Створіть virtualenv для проекту і встановіть необхідні бібліотеки. Завантажте PyPy з цього URL. Після завантаження, вилучіть файли і встановіть pip, якщо потрібно.

$ sudo apt-get install python-pip
$ virtualenv -p pypy-2.6.1-linux64/bin/pypy falconenv
$ source falconenv/bin/activate
$ pip install rethinkdb falcon gunicorn

Тепер ми з нашим стеком готові. PyPy, як інтерпретатор Python, Falcon, як веб фреймворк для створення RESTful API. Gunicorn - WSGI сервер, який обслуговує наш API. Тепер, давайте підготуємо наш клієнт бази даних rethinkDB для вибірки і вставки ресурсів. Дозвольте мені дати ім'я файлу "db_client.py"

#db_client.py
import os
import rethinkdb as r
from rethinkdb.errors import RqlRuntimeError, RqlDriverError

RDB_HOST = 'localhost'
RDB_PORT = 28015

# Datbase is todo and table is notes
PROJECT_DB = 'todo'
PROJECT_TABLE = 'notes'

# Set up db connection client
db_connection = r.connect(RDB_HOST,RDB_PORT)


# Function is for cross-checking database and table exists 
def dbSetup():
    try:
        r.db_create(PROJECT_DB).run(db_connection)
        print 'Database setup completed.'
    except RqlRuntimeError:
        try:
            r.db(PROJECT_DB).table_create(PROJECT_TABLE).run(db_connection)
            print 'Table creation completed'
        except:
            print 'Table already exists.Nothing to do'

dbSetup()

Не хвилюйтеся, якщо ви не знаєте про rethinkDB. Просто перейдіть за цим посиланням і подивіться швидкий запуск. Ми щойно підготували db connection клієнт і створили базу даних, таблиці. Настав час реальної справи. Falcon дозволяє визначити клас ресурсу, який ми можемо направити на URL-адресу. У цьому класі ресурсів ми можемо мати чотири методи REST

  1. on_get

  2. on_post

  3. on_put

  4. on_delete

Таким чином ми збираємося реалізувати перші дві функції в цій статті. Створіть файл з ім'ям app.py.

#app.py
import falcon
import json

from db_client import *

class NoteResource:
 
    def on_get(self, req, resp):
        """Handles GET requests"""
        # Return note for particular ID
        if req.get_param("id"):
            result = {'note': r.db(PROJECT_DB).table(PROJECT_TABLE). get(req.get_param("id")).run(db_connection)}
        else:
            note_cursor = r.db(PROJECT_DB).table(PROJECT_TABLE).run(db_connection)
            result = {'notes': [i for i in note_cursor]}
        resp.body = json.dumps(result)

    def on_post(self, req, resp):
         """Handles POST requests"""
         try:
             raw_json = req.stream.read()
         except Exception as ex:
             raise falcon.HTTPError(falcon.HTTP_400,'Error',ex.message)

         try:
             result = json.loads(raw_json, encoding='utf-8')
             sid =  r.db(PROJECT_DB).table(PROJECT_TABLE).insert({'title':result['title'],'body':result['body']}).run(db_connection)
             resp.body = 'Successfully inserted %s'%sid
         except ValueError:
             raise falcon.HTTPError(falcon.HTTP_400,'Invalid JSON','Could not decode the request body. The ''JSON was incorrect.')

api = falcon.API()
api.add_route('/notes', NoteResource())

Ми можемо поділити код на наступні частини.

  1. Ми імпортували falcon і клієнт бази даних

  2. Створили клас ресурсів з ім'ям NoteResource

  3. Створили два методи: on_get і on_post на NoteResource.

  4. У методі on_get, ми перевіряємо параметр "id" в запиті і відправляємо один ресурс (запис) або всі ресурси (записи). req, resp є об'єктами запиту і відповіді falcon відповідно.

  5. У методі on_post, ми перевіряємо данні як необроблений JSON. Ми декодуємо той необроблений JSON, для зберігання заголовку і тіла в rethinkDB таблиці записів.

  6. Ми створюємо falcon API клас і додаємо маршрут для нього. наприклад: '/notes' в нашому випадку.

Тепер для того, щоб обслуговувати API, ми повинні запустити WSGI сервер, бо falcon потребує незалежного серверу. Запускайте Gunicorn

$ gunicorn app:api

Це запустить Gunicorn WSGI сервер на порту 8000.

Відвідайте http://localhost:8000/notes, щоб переглянути всі збережені записи.

Якщо записи порожні, додайте їх за допомогою запиту POST на наш API.

Python Falcon API

Тепер додайте ще один запис, як показано вище, з різними даними. Давайте скажемо, що це { "title" : "At 10:00 AM" , "body" : " Scrum meeting scheduled"}. Тепер знову відвідайте http://localhost:8000/notes, і ви знайдете наступне:

Python Falcon API

Якщо ми хочемо, отримати елемент по id, то зробіть це з цим. http://localhost:8000/notes?id=d24866be-36f0-4713-81fd-750b1b2b3bd4. Тепер буде відображатись тільки один запис з даним id.

Python Falcon API

Так falcon дозволяє легко створити REST API на дуже низькому рівні. Є багато додаткових функцій, доступних для Falcon. Для більш детальної інформації відвідайте домашню сторінку Falcon. Якщо бажаєте побачити повний вихідний код демонстрації, яка представлена вище, перейдіть за цим посиланням.

https://github.com/narenaryan/Falcon-REST-API-Pattern

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 6.8K
Приєднався: 6 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація

Читайте також: pypy, http localhost 8000, localhost 8000