Недавно я начал работать с 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, что позволит вам добавить заметку.