2012-12-26 2 views
7

J'utilise Flask pour développer une application python. Pour le moment, je veux que cette application soit exécutée localement. Il s'exécute localement bien via python, mais lorsque j'utilise cx_freeze pour le transformer en exe pour Windows, je ne peux plus utiliser la méthode Flask.render_template(). Au moment où j'essaie d'exécuter un render_template, j'obtiens une erreur http 500, exactement comme si le template html que j'essaye de rendre n'existe pas.en utilisant cx_freeze sur l'application flask

Le fichier python principal s'appelle index.py. Au début, j'ai essayé de courir: cxfreeze index.py. Cela n'incluait pas le répertoire "templates" du projet Flask dans le répertoire "dist" de cxfreeze. Alors j'ai essayé d'utiliser ce script setup.py et j'ai exécuté python setup.py build. Cela inclut maintenant le dossier templates et le modèle index.html, mais je reçois toujours l'erreur http: 500 lorsqu'il essaie de rendre le modèle.

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')] 
) 

Voici un exemple de méthode à partir du script:

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

Si je cours index.py puis dans la console je reçois:

* 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 - 

et la page est affichée correctement dans mon navigateur , mais si je cours index.exe, je reçois

* 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 - 

et

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. 

dans mon navigateur.

Si je renvoie le code HTML brut, par ex.

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

puis cela fonctionne très bien. Donc, un travail possible est d'arrêter d'utiliser les modèles de Flask et de coder en dur toute la logique html dans le fichier python principal. Cela devient très salissant, donc je voudrais l'éviter si possible.

J'utilise Python 2.7 32 bits, Cx_freeze pour Python 2.7 32 bits et Flask 0,9

Merci pour toute aide et des idées!

Répondre

15

Après de nombreuses fausses pistes au chalut à travers les modules Flask et Jinga, j'ai finalement trouvé le problème.

CXFreeze ne reconnaît pas que jinja2.ext est une dépendance et ne l'incluait pas.

J'ai corrigé cela en incluant import jinja2.ext dans l'un des fichiers python.

CXFreeze a ensuite ajouté ext.pyc à library.zip \ jinja. (Copiez-le manuellement après la construction fonctionne également)

Juste au cas où quelqu'un d'autre est assez fou pour essayer d'utiliser Flask pour développer des applications exécutées localement :)

Questions connexes