8

Flask を使用して Python アプリを開発しています。現時点では、このアプリをローカルで実行したいと考えています。Python を使用してローカルで正常に実行されますが、cx_freeze を使用して Windows 用の exe に変換すると、Flask.render_template() メソッドを使用できなくなります。render_template を実行しようとすると、レンダリングしようとしている html テンプレートが存在しないかのように、http 500 エラーが発生します。

メインの python ファイルは index.py と呼ばれます。最初に実行しようとしました: cxfreeze index.py. これには、Flask プロジェクトの「templates」ディレクトリが cxfreeze の「dist」ディレクトリに含まれていませんでした。そこで、この setup.py スクリプトを使用して実行してみpython setup.py buildました。これには、テンプレート フォルダーと index.html テンプレートが含まれるようになりましたが、テンプレートをレンダリングしようとすると、まだ http: 500 エラーが発生します。

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 = '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 ビット、Python 2.7 32 ビット用の Cx_freeze、および Flask 0.9 を使用しています。

助けとアイデアをありがとう!

4

2 に答える 2

19

Flask および Jinga モジュールを何度もトロールした後、私は最終的に問題を発見しました。

CXFreeze は jinja2.ext が依存関係であることを認識せず、それを含めませんでした。

import jinja2.extPythonファイルの1つに含めることでこれを修正しました。

次に、CXFreezeext.pycが library.zip\jinja に追加されました。(ビルド後に手動でコピーすることもできます)

他の誰かが Flask を使用してローカルで実行されるアプリを開発しようとするほど怒っている場合に備えて:)

于 2012-12-28T12:52:50.297 に答える
0

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')]
)
于 2018-06-01T17:52:11.333 に答える