2010-08-17 10 views
7

Ho bisogno di memorizzare il codice Python in un database e caricarlo in una sorta di applicazione bootstrap.py per l'esecuzione. Non posso usare filesystem perché sto usando GAE, quindi questa è la mia unica scelta.Caricamento dinamico del codice dell'applicazione Python dal database in Google App Engine

Tuttavia, non sono un utente esperto di Python.

Ero già in grado di caricare 1 riga di codice ed eseguirlo utilizzando eval, tuttavia un pezzo di codice con due righe o più mi ha dato un errore di "sintassi non valida".

Sto anche pensando se è possibile estendere il caricatore "import" per implementare il caricamento del DB.

Grazie!

+0

Non so se è possibile, ma l'estensione dell'importazione sembra piuttosto creativa. – riwalk

+0

Se GAE ti consente di ignorare l'importazione, sarei sorpreso. Perché il codice di script in un database? Dato che pretendi di non avere esperienza con Python, probabilmente c'è un modo molto migliore per fare ciò che vuoi. Cosa stai cercando di realizzare. – msw

+0

Sto provando a creare un'app che abbia l'opzione di essere aggiornata "automaticamente" senza utilizzare GAE SDK. – hgf

risposta

2

Sono un po 'd'accordo con i commentatori di cui sopra, sembra piuttosto pericoloso. Tuttavia:

Ho sperimentato un po 'con App Engine Console (http://con.appspot.com/console/), e eval() in effetti tendeva a lanciare SyntaxError.

Invece, la dichiarazione exec potrebbe essere il tuo amico (http://docs.python.org/release/2.5.2/ref/exec.html).

sono riuscito a eseguire questo in App Engine Console:

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

in modo da provare l'affermazione exec, ma ricorda i molti molti (tanti!), Pericoli di codice provenienti direttamente dagli utenti finali.

+0

Grazie. Ho già risolto il mio problema. Penso di essere stato frainteso sul problema. Il mio intento è di abilitare l'aggiornamento automatico dell'applicazione quando necessario, invece di chiedere all'utente di scaricare GAE SDK per aggiornare l'applicazione dopo l'installazione. Pubblicherò la mia implementazione qui. – hgf

+0

Tuttavia, perché pensi che questo possa essere pericoloso? – hgf

+0

Questo potrebbe essere pericoloso se il codice precedente proviene dagli utenti finali, espone la tua app ad attacchi e/o stupidità. Anche se il gruppo di utenti è molto controllato, non si sa mai. –

4

Sono stato in grado di fare ciò che intendevo dopo aver letto di più sul caricamento del codice dinamico Python.

Ecco il codice di esempio. Ho rimosso le intestazioni per essere più leggero:

Grazie comunque!

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

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

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

+0

Quindi, come viene caricato 'DynCode'? Come viene testato 'dyn.code'? In quale stato si trova l'applicazione se c'è un errore di sintassi in 'dyn.code'? – msw

+0

DynCode è un semplice file importato nell'ultimo. Il test farò in un posto separato. Non c'è alcuna differenza nel caricare un codice spezzato dalla sintassi da un file separato o nel caricarlo da una stringa. – hgf

+0

Molto interessante. @HGF stai ancora usando questo codice dopo 3 anni? Sono interessato a fare qualcosa di simile. –

-5

Sono stato in grado di fare ciò che intendevo dopo aver letto di più sul caricamento dinamico del codice Python.

Oops, peccato che è broken by design perché non si capisce l'ambiente operativo:

App Engine utilizza più server Web per eseguire l'applicazione, e regola automaticamente il numero di server che sta utilizzando per gestire le richieste in modo affidabile. Una determinata richiesta può essere instradata a qualsiasi server, e potrebbe non essere essere lo stesso server che ha gestito una richiesta precedente dello stesso utente con .

+3

Questo non è il caso, se il codice che sta caricando deve solo servire la richiesta corrente. –

+1

msw. Capisco l'ambiente. Grazie per la tua preoccupazione. – hgf

2

Se si desidera un meccanismo più robusto, probabilmente si desidera leggere PEP302, che descrive i ganci di input. Puoi usarli per importare il codice piuttosto che doverlo valutare.

+0

Grazie! Questo è molto gradito. – hgf

Problemi correlati