在Google App Engine下从数据库动态加载Python应用程序代码

时间:2010-08-17 17:50:03

标签: python google-app-engine google-cloud-datastore

我需要将python代码存储在数据库中并将其加载到某种bootstrap.py应用程序中以便执行。我不能使用文件系统因为我使用的是GAE,所以这是我唯一的选择。

但是我不是经验丰富的python用户。

我已经能够加载1行代码并使用eval运行它,但是一行代码包含两行或更多行代码会给我一个“无效语法”错误。

我也在考虑是否可以扩展“import”加载器来实现数据库加载。

谢谢!

3 个答案:

答案 0 :(得分:4)

在阅读了有关Python动态代码加载的更多内容后,我能够做到我的意图。

以下是示例代码。我删除了标题更轻:

非常感谢!

=============

class DynCode(db.Model):
    name = db.StringProperty()
    code = db.TextProperty(default=None)

=============

class MainHandler(webapp.RequestHandler):
    def get(self):
        dyn = DynCode()
        dyn = "index"
        dyn.code = """
from google.appengine.ext import webapp
class MainHandler(webapp.RequestHandler):
    def get(self):
        self.response.out.write("Hello World\\n")
        self.response.out.write("Hello World 2\\n")
"""
        dyn.put()
        self.response.out.write("OK.")

def main():
    application = webapp.WSGIApplication([('/update', MainHandler)], debug=True)
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()

==================================

def main():
    query = DynCode.all()
    dyncodes = query.fetch(1)
    module = imp.new_module('mymodule')
    for dyn in dyncodes:
        exec dyn.code in module.__dict__

    application = webapp.WSGIApplication([('/', module.MainHandler)], debug=True)
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()

=======================

答案 1 :(得分:2)

我有点赞同上面的评论员,这听起来有点危险。但是:

我使用App Engine控制台(http://con.appspot.com/console/)进行了一些实验,而eval()确实倾向于抛出SyntaxError

相反,exec语句可能是您的朋友(http://docs.python.org/release/2.5.2/ref/exec.html)。

我设法在App Engine控制台中运行它:

>>> exec "def f(x):\n    x = x + 1\n    y = 10\n    return x + y"
>>> f(10)
21

所以试试exec语句,但要记住直接来自最终用户的许多(很多!)代码的危险。

答案 2 :(得分:2)

如果你想要一个更健壮的机制,你可能想阅读描述输入挂钩的PEP302。您可以使用它们来导入代码而不必对其进行评估。