использование приложения CX freeze on flask


Я использую Flask для разработки приложения python. На данный момент я хочу, чтобы это приложение работало локально. Он работает локально нормально через python, но когда я использую cx_freeze, чтобы превратить его в exe для Windows, я больше не могу использовать колбу.метод render_template (). В тот момент, когда я пытаюсь выполнить render_template, я получаю ошибку http 500, точно так же, как если бы шаблон html, который я пытаюсь отрисовать, не существовал.

Основной файл python называется index.py сначала я попытался бежать: cxfreeze index.py. Этого не произошло включите каталог " templates "из проекта Flask в каталог cxfreeze" dist". И тогда я попробовал использовать это setup.py скрипт и запуск python setup.py build. Теперь сюда входят папка templates и индекс.html-шаблон, но я все равно получаю ошибку http: 500, когда он пытается отобразить шаблон.

from cx_Freeze import setup,Executable

includefiles = [ 'templatesindex.html']
includes = []
excludes = ['Tkinter']

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

Вот пример метода из скрипта:

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

Если я запускаю index.py , то в консоли я получаю:

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

И страница отображается правильно в моем браузере, но если Я бегу index.exe, я получаю

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

И

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.

В моем браузере.

Если я возвращаю необработанный html, например

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

Тогда это работает нормально. Поэтому возможным обходным путем является прекращение использования шаблонов Flask и жесткий код всей логики html в основной файл python. Это становится очень грязным, хотя, так что я хотел бы избежать этого, если это возможно.

Я использую Python 2.7 32-bit, Cx_freeze для Python 2.7 32-bit и Flask 0.9

Спасибо за любую помощь и идеи!

2 7

2 ответа:

После множества ложных следов, проходящих через колбу и модули Jinga, я, наконец, нашел проблему.

CXFreeze не признает, что jinja2.ext-это зависимость,и она не была включена.

Я исправил это, включив import jinja2.ext в один из файлов python.

CXFreeze затем добавил ext.pyc в библиотеку.зип\Джинджа. (Копирование его вручную после сборки также работает)

На всякий случай, если кто-то еще достаточно безумен, чтобы попробовать использовать Flask для разработки локально запущенных приложений:)

Альтернативой import jinja2.ext в исходном файле является конкретное включение jinja2.ext в исходный файл. setup.py:

from cx_Freeze import setup,Executable

includefiles = [ 'templates\index.html']
includes = ['jinja2.ext']  # add jinja2.ext here
excludes = ['Tkinter']

setup(
name = 'index',
version = '0.1',
description = 'membership app',
author = 'Me',
author_email = 'me@me.com',
# Add includes to the options
options = {'build_exe':   {'excludes':excludes,'include_files':includefiles, 'includes':includes}},   
executables = [Executable('index.py')]
)