Недавно я начал работать с Falcon Framework над созданием API для сайта с сокращением URL. Мой друг показал мне фреймворк, и я решил попробовать. Это немного требует обучения на других распространенных фреймворках, таких как Django или Flask, но как только вы освоите это, с ним будет очень легко работать.

В этой статье я рассмотрю базовую настройку Falcon REST API с поддержкой MongoDB. Это первая часть в серии статей о том, как создать полное веб-приложение на Dart, Falcon, MongoDB.

Для начала нам понадобится такая файловая структура:

- app/
|- controllers/
|- resources/
|- models/
|- __init__.py
|- settings.py
- app.py

Вся наша логика будет находиться внутри папки app/. Внутри этой папки приложения у нас есть папка controllers/, в которой будут храниться вспомогательные функции и логика для связи с нашей базой данных и выполнения внутренних функций, папкаresources/, которая будет содержать все наши маршруты, а папкаmodels/ будет содержать логику для настройки наших моделей в наша база данных. Файл settings.py содержит нашу конфигурацию для приложения, где мы будем хранить наши переменные для учетных данных, а что нет. Убедитесь, что вы добавили __init__.py файл в каждую папку внутриapp/. Файл верхнего уровня __init__.py будет включать нашу базовую настройку и определение нашего приложения. Начнем с получения зависимостей, необходимых для запуска нашего приложения.

Убедитесь, что в вашей системе установлен mongoDB или база данных размещена на сервере. Если он у вас размещен на вашем сервере, то константа HOST в нашей папке settings.py будет IP этого адреса. Если у вас есть база данных, размещенная локально для целей разработки, вы будете использовать localhost в качестве константы HOST.

Вы можете проверить, установлена ​​ли у вас mongoDB, запустив:

mongod --version

Если вы видите что-то вроде:

root@mainbox:~# mongod --version
db version v3.2.22

тогда вы должны быть настроены. Вероятно, будет больше информации о вашей среде, но первая строка - это все, что имеет значение. Для этого я буду использовать mongoDB версии 3.2.22.

Чтобы настроить наши зависимости Python, мы начнем с создания virtualenv:

pip3 install virtualenv
virtualenv .venv
source .venv/bin/activate # or .venv/Scripts/activate on Windows
pip install falcon falcon-jsonify mongoengine

Если вы используете Unix или Linux, вам также потребуется установить веб-сервер для запуска приложения. Вы можете использовать uwsgi или gunicorn. Если вы работаете в Windows, вы захотите использовать модуль waitress.

Чтобы установить uwsgi или gunicorn:

pip install uwsgi
pip install gunicorn

Чтобы установить официантку и хуппер для горячей перезагрузки:

pip install waitress hupper

Официантка не включает опцию горячей перезагрузки по умолчанию, такую ​​как uwsgi или gunicorn, поэтому вы должны использовать hupper, чтобы иметь эту функцию (это значительно упрощает разработку, но это не обязательно).

Теперь, когда у нас установлены все наши зависимости, мы можем приступить к настройке нашего приложения. Откройте наш settings.py файл внутри app/. Настройте его, как следующий фрагмент, заменяющий вашу информацию:

import os
import flask_jsonfiy
dbcfg = {
    'host': 'localhost', # or external server address
    'port': 27017,
    'username': os.environ.get('MONGO_USER'),
    'password': os.environ.get('MONGO_PASS'),
}
middleware = [
    falcon_jsonify.Middleware(help_messages=True),
]

На данный момент это все, что нам нужно. Если вы в конечном итоге используете промежуточное ПО или вам нужно настроить другие параметры, сделайте это внутри этого файла и импортируйте его из других модулей.

Теперь мы можем установить наш основной __init__.py файл в папку app/. Настройте это так:

import falcon
import mongoengine as mongo
from app.settings import middleware
app = falcon.API(middleware=middleware)
db = mongo.connect(
    'development', # This will be the name of your database
    host=dbcfg['host'],
    port=dbcfg['port'],
    username=dbcfg['username'],
    password=dbcfg['password']
)

Пока это все, что нам нужно, пока мы не добавим конечную точку в resources/. Теперь мы можем настроить нашу базовую модель пользователя для веб-сайта. Это единственная модель, над которой мы будем работать в этой части урока. Для начала создайте внутри models/ файл под названием notes_model.py. Вы должны настроить свой файл так:

from mongoengine import *
import datetime
class NoteModel(Document):
   title = StringField(max_length=200, required=True)
   body = StringField(max_length=32, required=True, unique=True)

На данный момент в этой модели не так много деталей, но вы добавите к ней позже. Теперь мы можем перейти к настройке нашей основной конечной точки регистра. Откройте папку resources/ и добавьте файл с именем notes.py. Внутри этого файла мы добавим логику для настройки наших обработчиков и ответов. Вы также должны создать файл с именем notes.py внутри папки controllers/. Эти файлы будут работать вместе. Настройте файл resources/notes.py следующим образом:

import falcon
from app.controllers.notes import NotesController
from app import db
from app.models.notes_model import NoteModel
class GetNotes(object):
    def on_get(self, req, resp, id):
        resp.status = falcon.HTTP_200
        notes = []
        notes_obj = NoteModel.objects(title=title)
        for object in notes_obj:
            notes.append(object)
        resp.json = {
            'notes': notes
        }
class UploadNotes(object):
    def on_post(self, req, resp):
        title = resp.get_json('title', dtype=str)
        body = resp.get_json('body', dtype=str)
        notes_obj = NoteModel(
            title=title, body=body
        )
        notes_obj.save()
        resp.status = falcon.HTTP_201
        resp.json = {
            'message': 'Your Note Has Been Posted!',
            'status': 200,
            'successful': True
        }

Теперь, когда у нас есть настройки ресурсов, мы можем открыть наш основной __init__.py файл в папке app/. Вам нужно добавить эти строки внизу:

from app.resources.notes import *
app.add_route('/notes/', UploadNotes)
app.add_route('/notes/{}', GetNotes)

В отличие от других фреймворков вы не собираетесь ничего возвращать. Это все, что нам нужно для базового REST API. Теперь мы можем связываться с нашей базой данных mongoDB, отправляя запросы на наш сервер.

Теперь мы можем запустить наше веб-приложение:

С Gunicorn:

gunicorn -p 8000 --reload app:app

С uWSGI:

uwsgi --http :9090 --wsgi-file app.py

С официанткой и Хаппером:

hupper -m waitress --port=8000 app:app

Теперь ваш сервер должен работать на http: // localhost: 8000 /. Вы должны попытаться опубликовать что-нибудь в / notes / endpoint, что позволит вам добавить заметку.