Как заставить Eve создавать конечные точки DOMAIN программно - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь заставить Python Ева создавать разные коллекции программно,

Допустим, я хочу показать конечную точку, получающую схему, чтобы иметь возможность создать эту коллекцию в пн go:

т.е.

DOMAIN = {}

app.route('/gen')
def gen(schema):
    app.config['DOMAIN'][schema.name] = schema.def # <-- This obviously does not work, don't know how to focus it

Чтобы через curl я мог опубликовать эту схему def:

curl -H "Content-Type: application/json" -d '[{"name":"test", "def": "{\"age\":\"int\"}"}]' http://localhost:5000/gen

И объекты POST этой новой коллекции (теста) создали

curl -H "Content-Type: application/json" -d '[{"age":5]' http://localhost:5000/test

Очевидно, это только начальная проблема. Чтобы сохранить его в будущем, мне нужно сохранить эти данные в mon go и загрузить их после запуска приложения, чтобы "mon go autodefines python eve DOMAIN себе". Я надеюсь, что это также будет возможно для достижения

1 Ответ

1 голос
/ 11 марта 2020

Мой подход заключается в использовании пользовательских настроек для Eve() объекта:

app = eve.Eve(settings=settings)

, где settings содержит DOMAIN определение:

settings = {
    "SERVER_NAME": None,
    "DEBUG": True,

    # MongoDB params
    "MONGO_HOST": '...',
    "MONGO_PORT": 27017,
    "MONGO_USERNAME": '...',
    "MONGO_PASSWORD": '...',

    .....

    # add to DOMAIN all collections defined in `schema`
    "DOMAIN": {
        # doc
        'app_doc': {
            'item_title': 'app_doc',
            'resource_methods': ['GET', 'POST', 'DELETE'],
            'allow_unknown': True,
            'schema': {
                'name': {'type': 'string', 'required': True},
    ....
}

Переменная настроек может быть изменена для получения параметров из базы данных (я использую коллекцию с именем app_schema, где я храню эти пользовательские определения для конечных точек).

Просто подключитесь к Mon go (я использую pymon go) до создания Eve(), затем заполните settings["DOMAIN"] всеми данными из коллекции app_schema, затем передайте эту переменную настроек в Eve(settings=settings). Пример здесь:

# setup Mongo connection (@see config.py - store here default schemas and DOMAIN)
client = MongoClient(settings["MONGO_HOST"], settings["MONGO_PORT"])
db = client.docfill

# check app_schema collection
tab_schemas = db.app_schema.find({})


def load_settings_from_schema_collection():
    """
    Defines a new settings DOMAIN variable loaded with metadata regarding "ent_"-collections
        create other API endpoints by definitions found in schema
        this is a huge workload, as it analyzes each schemadef and create endpoints for various operations
        like GET/POST/DEL/PUT/PATCH and search
        :return:
    """
    i = 0

    # add to `settings` new definitions from app_schema collection
    global settings

    # now parse each doc and create settings table for it, the insert settings table into DOMAIN definition
    for doc in tab_schemas:
        i = i + 1
        # this name should be unique for each collection
        this_collection_name = "ent_" + doc["collection"]
        # only allow "ent_" prefixed schemas to be overridden
        this_schema_setting = {
            "datasource": {
                "source": this_collection_name  # important ca tabela sa fie definita cu prefix
            },
            "resource_methods": ['GET', 'POST', 'DELETE'],
            "item_methods": ['GET', 'DELETE', 'PUT', 'PATCH'],
            "schema": {}
        }

        for fld_meta in doc["content"]:
            this_schema_setting["schema"][fld_meta] = {"type": doc["content"][fld_meta]["type"]}

            # is there a required option ?
            if "required" in doc["content"][fld_meta]:
                this_schema_setting["schema"][fld_meta] = {"required": bool(doc["content"][fld_meta]["required"])}

        settings["DOMAIN"][this_collection_name] = this_schema_setting

        # output everything in settings variable to config.js (just for viewing what happens in settings)
        file = "config.js"
        with open(file, 'w') as filetowrite:
            filetowrite.write('settings = ' + json.dumps(settings, indent=4, sort_keys=True))

    return 1


# load settings from schema collections in MongoDB: collection=app_schema
load_settings_from_schema_collection()

И наконец, запустите сервер:

app = eve.Eve(settings=settings)

app.run(...)

Надеюсь, это поможет!

...