Динамическая загрузка кода приложения Python из базы данных в Google App Engine

Мне нужно сохранить код python в базе данных и загрузить его в какое-то приложение bootstrap.py для выполнения. Я не могу использовать файловую систему, потому что я использую GAE, поэтому это мой единственный выбор.

Однако я не опытный пользователь python.

Я уже смог загрузить 1 строку кода и запустить ее с помощью eval, однако фрагмент кода с двумя строками или более дал мне ошибку «недопустимый синтаксис».

Я также думаю, что можно расширить загрузчик «import» для реализации загрузки БД.

Благодаря!

4 Solutions collect form web for “Динамическая загрузка кода приложения Python из базы данных в Google App Engine”

Я смог сделать то, что я намерен, после того, как прочитал больше о загрузке динамического кода 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() . 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() 

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

Я несколько согласен с комментаторами выше, это звучит опасно. Однако:

Я немного экспериментировал с консолью App Engine Console ( 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):\nx = x + 1\ny = 10\n return x + y" >>> f(10) 21 

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

Если вы хотите создать более надежный механизм, вы, вероятно, захотите прочитать PEP302 , который описывает входные крючки. Вы можете использовать их для импорта кода, а не для его оценки.

Я смог сделать то, что я намерен, после того, как прочитал больше о загрузке динамического кода Python.

Ой, слишком плохо, что он разбит дизайном, потому что вы не понимаете операционную среду:

App Engine использует несколько веб-серверов для запуска вашего приложения и автоматически настраивает количество серверов, которые он использует, чтобы надежно обрабатывать запросы. Данный запрос может быть перенаправлен на любой сервер, и это может быть не тот же сервер, который обрабатывал предыдущий запрос от того же пользователя.

  • Перерыв на необработанное исключение в pycharm
  • API приложений (Python) Datastore Precall API
  • Google Closure Linter не работает в Sublime Text 2 для Windows
  • Как получить встроенный объект с повторяющимися свойствами с помощью datastore java client
  • Создайте хороший URL-адрес для ключа с предками
  • Загрузка объектов хранилища данных из проекта Python в Go приводит к вложенным structs slices of slices error
  • IOError: файл недоступен GAE
  • Рекурсивное удаление в движке Google
  • Python - лучший язык программирования в мире.