我使用cx_freeze和我的烧瓶应用程序,但总是得到ERR_EMPTY_RESPONSE,为什么?

时间:2015-11-07 16:49:13

标签: python flask cx-freeze

我使用python 3.4和最新烧瓶0.10.1,flask-bootstrap 3.3.5.6,flask-wtf 0.12,Jinja2 2.8来制作我的网络应用程序。

现在我尝试使用cx_freeze将我的应用转换为.exe。

我的应用在python中工作正常。但冻结后,浏览器会获得ERR_EMPTY_RESPONSE。

我写了一个简单的测试用例,它有同样的问题。

这个问题花了我几个小时。可能是因为使用模板造成的?谁能帮帮我?

这是我的setup.py

from cx_Freeze import setup, Executable

includefiles = ['templates/', 'static/']

base = None

main_executable = Executable("starter.py", base=base, copyDependentFiles=True)

setup(name="Example",
      version="0.1",
      description="Example Web Server",
      options={
      'build_exe': {
          'packages': ['jinja2',
                       'jinja2.ext',
                       'flask_wtf',
                       'flask_bootstrap',
                       'os'],
          'include_files': includefiles,
          'include_msvcr': True}},
      executables=[main_executable], requires=['flask', 'wtforms'])

starter.py:

from IndividualWebsite import app

app.run()

IndividualWebsite.py:

from flask import Flask, render_template, request, session, redirect, url_for, flash

from flask_bootstrap import Bootstrap
import jinja2.ext

from flask_wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required

app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
bootstrap = Bootstrap(app)


class NameForm(Form):
    name = StringField('What is your name?', validators=[Required()])
    submit = SubmitField('Submit')


@app.route('/', methods=['GET', 'POST'])
def index():
    form = NameForm()
    if form.validate_on_submit():
        old_name = session.get('name')
        if old_name is not None and old_name != form.name.data:
            flash('Looks like you have changed your name!')
        session['name'] = form.name.data
        return redirect(url_for('index'))
    return render_template('index.html', form=form, name=session.get('name'))

我的index.html是jinja2模板:

{% extends 'base.html' %}
{% import "bootstrap/wtf.html" as wtf %}

{% block page_content %}
<div class="page-header">
    <h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>
</div>
{{ wtf.quick_form(form) }}
{% endblock %}

基础模板正在使用boostrap模板。

更新1: 冻结服务器只显示

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

,没有别的

更新2: 如果我只是返回一个字符串:

return '<h1>Test</h1>'

服务器可以响应正确的内容。它可能是由模板引起的。

更新3: 哦,我怕我搞错了。原因500错误hanlder也是由模板写的。解决之后,真正的错误是找不到模板:index.html&#39;

但是我在setup.py中包含了所有模板,它们存在于&#39; build / xxx / templates&#39;目录。为什么呢?

1 个答案:

答案 0 :(得分:3)

最后我找到了解决方案。

  • 我将烧瓶应用的模板文件夹重置为&#39; ./ templates&#39;在starter.py中:

    import os
    from IndividualWebsite import app
    
    abs_path = os.path.abspath('.')
    app.template_folder = abs_path + '/templates'
    
    app.run()
    
  • 我也使用flask-bootstrap。所以我必须包括flask-bootstrap的模板和宏。我所做的就是将所有这些内容复制到我的模板文件夹中,并根据副本制作我自己的模板。

希望这些对于想要分发烧瓶app的人有用。