Python 如何使eve以编程方式创建域终结点

Python 如何使eve以编程方式创建域终结点,python,flask,eve,Python,Flask,Eve,我试图让Python Eve以编程方式创建不同的集合 假设我想公开接收模式的端点,以便能够在mongo中创建该集合: i、 e 和创建此新集合(测试)的POST对象 显然,这只是最初的问题。为了在将来保存它,我需要将这些数据保存在mongo中,并在应用程序启动后加载,以便“mongo自动定义PythonEVE域本身”。我希望这也能实现我的方法是为Eve()对象使用自定义设置: app=eve.eve(设置=设置) 其中设置包含域定义: settings = { "SERVER_NAME"

我试图让Python Eve以编程方式创建不同的集合

假设我想公开接收模式的端点,以便能够在mongo中创建该集合:

i、 e

和创建此新集合(测试)的POST对象


显然,这只是最初的问题。为了在将来保存它,我需要将这些数据保存在mongo中,并在应用程序启动后加载,以便“mongo自动定义PythonEVE域本身”。我希望这也能实现

我的方法是为
Eve()
对象使用自定义设置:

app=eve.eve(设置=设置)

其中
设置
包含
定义:

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
的集合,其中保存了端点的自定义定义)

在实例化
Eve()
之前,只需连接到Mongo(我使用pymongo),然后用
app\u schema
集合中的所有数据填充
settings[“DOMAIN”]
,然后将此设置变量传递到
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(...)
希望有帮助

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},
    ....
}
# 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(...)