8
votes

Chargement dynamique du code d'application Python de la base de données sous Google App Moteur

J'ai besoin de stocker du code Python dans une base de données et de le charger dans une autre sorte d'application bootstrap.py d'exécution. Je ne peux pas utiliser le système de fichiers parce que j'utilise Gae, c'est donc mon seul choix.

Cependant, je ne suis pas un utilisateur expérimenté Python.

J'ai déjà pu charger 1 ligne de code et l'exécuter à l'aide d'EVAL, mais un morceau de code avec deux lignes ou plus m'a donné une erreur "Syntaxe invalide".

Je pense aussi que s'il est possible d'étendre le chargeur "Importer" pour implémenter le chargement de la DB.

Merci!


10 commentaires

Je ne sais pas si cela est possible, mais la prolongation de l'importation sonne assez créative.


Si GAE vous permet de remplacer importer , je serais surpris. Pourquoi le code de script dans une base de données? Puisque vous ne prétendez pas être expérimenté avec Python, il y a probablement un meilleur moyen de faire ce que vous voulez. Qu'est-ce que vous essayez d'accomplir.


J'essaie de créer une application qui a la possibilité d'être mise à jour "automatiquement" sans utiliser GAE SDK.


Ooh co-morphing code. Quelle horrible idée. Avez-vous regardé la version de l'application de GAE?


Ce n'est pas le propos. Je veux faire une application qui peut être utilisée et mise à jour par des non-programmeurs.


Si les modifications apportées à l'application sont effectuées par des non-programmeurs, comment le code est-il stocké dans la DB?


... sans avoir à télécharger et à installer une sorte de SDK pour les futures mises à jour.


Donc, vous n'avez pas regardé la version de l'application. appengine.google.com/Deployment?&app_id=Your_app_id


C'est probablement une idée terrible. Mais vous peut Nursez l'importation d'importation dans App Moteur.


La versioning n'est pas utile pour ce qu'il veut faire


3 Réponses :


2
votes

Je suis un peu d'accord avec les commentateurs ci-dessus, cela semble un peu dangereux. Toutefois:

J'ai expérimenté un peu avec une console de moteur d'application ( http://con.appot.com/console / ), et eval () effectivement tendance à lancer syntaxerror 's.

à la place, le exécuté La déclaration pourrait être votre ami ( http://docs.python.org /Release/2.5.2/ref/exec.html ).

J'ai réussi à exécuter ceci dans la console de moteur d'application: xxx

Alors, essayez la déclaration EXEC , mais souvenez-vous de nombreux périls de code provenant des utilisateurs finaux.


4 commentaires

Merci. J'ai déjà résolu mon problème. Je pense avoir mal compris sur le problème. Mon intention est de permettre à l'application d'être auto-mise à jour si nécessaire au lieu de demander à l'utilisateur de télécharger GAE SDK pour mettre à jour l'application après l'installation. Je posterai ma mise en œuvre ici.


Cependant, pourquoi pensez-vous que cela peut être dangereux?


Cela serait dangereux si le code ci-dessus provenait des utilisateurs finaux, il expose votre application aux attaques et / ou à la stupidité. Même si le groupe d'utilisateurs est très contrôlé, vous ne savez jamais.


D'accord. Ceci est un environnement contrôlé. Le code dans DB ne sera remplacé que par l'application elle-même et sera probablement téléchargé à partir d'une seule source poussée.



4
votes

J'ai pu faire ce que j'avais l'intention après avoir lu plus sur le chargement de code dynamique Python.

Voici le code de l'échantillon. J'ai retiré les en-têtes pour être plus léger: p>

Merci quand même! P>

============= P>

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()


4 commentaires

Alors, comment le dyncode est-il chargé? Comment dyn.code est-il testé? Dans quel état est l'application dans s'il existe une erreur de syntaxe dans dyn.code ?


Dyncode est un fichier simple importé dans la dernière. Les tests que je ferai dans un endroit séparé. Il n'y a pas de différence de chargement d'un code brisé Syntaxe à partir d'un fichier séparé ou de le chargement d'une chaîne.


Très intéressant. @Hgf utilisez-vous toujours ce code après 3 ans? Je suis intéressé à faire quelque chose de similaire.


Salut @eraspunkunkunkunkunkunkunkunkunkunkunkunkunk. Le code a fonctionné à cette époque. J'ai arrêté ce projet pour que je ne sais pas si cela fonctionne toujours.