2012-12-26 12 views
7

Sto utilizzando Flask per sviluppare un'applicazione python. Al momento, voglio che questa app venga eseguita localmente. Funziona localmente bene tramite python, ma quando uso cx_freeze per trasformarlo in un exe per Windows, non posso più usare il metodo Flask.render_template(). Nel momento in cui provo ad eseguire un render_template, ottengo un errore http 500, esattamente come se il template html che sto cercando di rendere non esistesse.utilizzando cx_freeze sull'app mobile

Il file python principale è denominato index.py. All'inizio ho provato a eseguire: cxfreeze index.py. Questo non includeva la directory "templates" dal progetto Flask nella directory "dist" di cxfreeze. Quindi, ho provato a utilizzare questo script setup.py ed eseguire python setup.py build. Questo include ora la cartella dei modelli e il modello index.html, ma ottengo ancora l'errore http: 500 quando tenta di eseguire il rendering del modello.

from cx_Freeze import setup,Executable 

includefiles = [ 'templates\index.html'] 
includes = [] 
excludes = ['Tkinter'] 

setup(
name = 'index', 
version = '0.1', 
description = 'membership app', 
author = 'Me', 
author_email = '[email protected]', 
options = {'build_exe': {'excludes':excludes,'include_files':includefiles}}, 
executables = [Executable('index.py')] 
) 

Ecco un metodo di esempio dallo script:

@app.route('/index', methods=['GET']) 
def index(): 
    print "rendering index" 
    return render_template("index.html") 

Se corro index.py poi nella console ottengo:

* Running on http://0.0.0.0:5000/ 
rendering index 
127.0.0.1 - - [26/Dec/2012 15:26:41] "GET/HTTP/1.1" 200 - 
127.0.0.1 - - [26/Dec/2012 15:26:42] "GET /favicon.ico HTTP/1.1" 404 - 

e la pagina viene visualizzata correttamente nel mio browser , ma se corro index.exe, ottengo

* Running on http://0.0.0.0:5000/ 
rendering index 
127.0.0.1 - - [26/Dec/2012 15:30:57] "GET/HTTP/1.1" 500 - 
127.0.0.1 - - [26/Dec/2012 15:30:57] "GET /favicon.ico HTTP/1.1" 404 - 

e

Internal Server Error 

The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application. 

nel mio browser.

Se restituisco HTML grezzo, ad es.

@app.route('/index', methods=['GET']) 
def index(): 
    print "rendering index" 
    return "This works" 

quindi funziona correttamente. Quindi una possibile soluzione è smettere di usare i modelli di Flask e hardcode tutta la logica html nel file python principale. Questo diventa molto complicato, quindi mi piacerebbe evitarlo se possibile.

sto usando Python 2.7 a 32 bit, Cx_freeze per Python 2.7 a 32 bit, e Flask 0,9

Grazie per qualsiasi aiuto e le idee!

risposta

15

Dopo molte false piste che passano attraverso i moduli Flask e Jinga, ho finalmente trovato il problema.

CXFreeze non riconosce che jinja2.ext è una dipendenza e non lo includeva.

Ho risolto questo problema includendo import jinja2.ext in uno dei file python.

CXFreeze ha quindi aggiunto ext.pyc a library.zip \ jinja. (Copiandolo manualmente dopo che la compilazione funziona anche)

Nel caso in cui qualcun altro è abbastanza folle da provare a usare Flask per sviluppare app a esecuzione locale :)

Problemi correlati