Наскоро започнах да работя с 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

За да инсталирате сервитьорка и hupper за горещи презареждания:

pip install waitress hupper

Waitress не включва опция за горещо презареждане по подразбиране като 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/, което ще ви позволи да добавите бележка.