2012-12-26 43 views
7

Tôi đang sử dụng Flask để phát triển ứng dụng python. Hiện tại, tôi muốn ứng dụng này được chạy cục bộ. Nó chạy cục bộ tốt thông qua python, nhưng khi tôi sử dụng cx_freeze để biến nó thành một exe cho Windows, tôi không còn có thể sử dụng phương thức Flask.render_template() nữa. Thời điểm tôi cố gắng thực hiện render_template, tôi nhận được lỗi http 500, chính xác như thể mẫu html tôi đang cố gắng hiển thị không tồn tại.sử dụng cx_freeze trên ứng dụng bình

Tệp python chính được gọi là index.py. Lúc đầu, tôi đã cố gắng chạy: cxfreeze index.py. Điều này không bao gồm thư mục "mẫu" từ dự án Flask trong thư mục "dist" cxfreeze. Vì vậy, sau đó tôi đã thử sử dụng tập lệnh setup.py này và chạy python setup.py build. Điều này hiện bao gồm thư mục mẫu và mẫu index.html, nhưng tôi vẫn gặp lỗi http: 500 khi nó cố gắng hiển thị mẫu.

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

Dưới đây là một phương pháp ví dụ từ các kịch bản:

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

Nếu tôi chạy index.py sau đó trong giao diện điều khiển tôi nhận được:

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

và trang web được hiển thị đúng trong trình duyệt của tôi , nhưng nếu tôi chạy index.exe, tôi nhận được

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

trong trình duyệt của tôi.

Nếu tôi trả về html thô, ví dụ:

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

thì nó hoạt động tốt. Vì vậy, một công việc có thể xung quanh là ngừng sử dụng các mẫu của Flask và mã hóa tất cả logic html vào tệp python chính. Điều này rất lộn xộn, vì vậy tôi muốn tránh nó nếu có thể.

Tôi đang sử dụng Python 2.7 32-bit, Cx_freeze cho Python 2.7 32-bit, và Flask 0,9

Nhờ sự giúp đỡ và những ý tưởng!

Trả lời

15

Sau nhiều đường mòn giả mạo xuyên qua các mô-đun Flask và Jinga, cuối cùng tôi đã tìm thấy vấn đề.

CXFreeze không nhận ra rằng jinja2.ext là phụ thuộc và không bao gồm nó.

Tôi đã sửa lỗi này bằng cách thêm import jinja2.ext vào một trong các tệp python.

CXFreeze sau đó thêm ext.pyc vào library.zip \ jinja. (Sao chép nó theo cách thủ công sau khi bản dựng cũng hoạt động)

Chỉ trong trường hợp bất kỳ ai khác đủ điên để thử sử dụng Flask để phát triển các ứng dụng chạy cục bộ :)

Các vấn đề liên quan