Python 如何在GAE数据存储中创建运行时确定类型的实体?

Python 如何在GAE数据存储中创建运行时确定类型的实体?,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我有一个URL路由,它捕获将为其创建实体的模型的名称。(例如,'/New/')现在,我将模型名称作为字符串。如何获取该字符串并使用它创建此模型的新实体以放入数据存储 我正在为GAE构建一个自定义管理界面,该界面能够注册新模型,并根据注册的模型动态构建表单。我需要一种方法,然后能够采取由管理员用户提交的发布数据,并将其放入数据存储使用正确的模型,这将在该表单发布到的URL。我目前正在构建一个处理程序来处理进入该URL方案的请求,但遇到了这个障碍。非常感谢您的帮助。尽管您可以使用 globals()

我有一个URL路由,它捕获将为其创建实体的模型的名称。(例如,
'/New/'
)现在,我将模型名称作为字符串。如何获取该字符串并使用它创建此模型的新实体以放入数据存储


我正在为GAE构建一个自定义管理界面,该界面能够注册新模型,并根据注册的模型动态构建表单。我需要一种方法,然后能够采取由管理员用户提交的发布数据,并将其放入数据存储使用正确的模型,这将在该表单发布到的URL。我目前正在构建一个处理程序来处理进入该URL方案的请求,但遇到了这个障碍。非常感谢您的帮助。

尽管您可以使用

globals()[modelname]
model[modelname]
如果模型类是在模块级别定义的,正如@TimHoffman在评论中指出的那样,允许(潜在的恶意)用户任意访问您的全局文件通常不是一个好主意

由于您是动态生成模型类,因此更安全的方法是将这些模型类保存在dict中:

model = { 'MyModel': MyModelClass, ... }
然后给定字符串名
modelname
,您可以使用

globals()[modelname]
model[modelname]

我没有使用globals来获取我的类构造函数。相反,我创建了一个指向当前模块的变量,并使用getattr来捕获我的类构造函数。这是我的处理程序,以防其他人想看看我做了什么

class NewThingHandler(BaseRequestHandler):
    def get(self, thing):
        self.redirect('/admin/')
    def post(self, thing):
        this_module = sys.modules[__name__]
        ThisModel = getattr(this_module, thing)
        arguments = {}
        for property in ThisModel.properties().keys():
            if type(ThisModel._properties[property]) is db.DateProperty:
                this_date = map(int, self.request.get(property).split('/'))
                this_date = datetime.date(this_date[2], this_date[0], this_date[1])
                arguments[property] = this_date
                continue
            arguments[property] = self.request.get(property)

        new_thing = ThisModel(**arguments)
        new_thing.put()
        self.redirect('/admin/')

东西
是从URL中捕获的。

假设请求中的任何名称都映射到全局,这有点危险。我将创建一个模型的显式注册表(一个字典),并根据需要从字典中获取模型类?它是否是一个字符串键,模型名称映射到模型?我想弄清楚这些碎片是如何组合在一起的@蒂姆霍夫曼