использование приложения 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 ответа:
После множества ложных следов, проходящих через колбу и модули 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')] )