如何渲染模板并与烧瓶同时发送文件

时间:2017-10-17 11:29:57

标签: python flask

这个烧瓶应用程序的目标是填充表单,解析生成的表单的数据,启动构建,压缩并将此构建发送给用户。

一切正常,但我希望一旦填写表单,用户就会被重定向到等待页面,如果可能的话。

这是我目前的代码:

def create_and_download_build(form)
        # Some parsing in the beginning of the function, the build etc...
        os.system('tar -zcvf build.tar.gz dist/')
        headers = {"Content-Disposition": "attachment; filename=build.tar.gz"}
        with open('build.tar.gz', 'r+b') as data_file:
            data = data_file.read()
        response = make_response(render_template('waiting.html'), (data, headers))
        return response

这是我的_init __。py:

中声明此函数的地方
@app.route('/', methods=('GET', 'POST'))
    def index():
        form = MyForm() # MyForm is a class in which there is some 
                        # wtform field (for example TextField)
        if form.validate_on_submit(): # This is called once the form is validated
            return create_and_download_build(request.form)
        return render_template('index.html', form=form)

它不起作用,我在调用make_response的行中收到此错误: AttributeError: 'tuple' object has no attribute 'decode'

如果我将make_response更改为:response = make_response((data, headers)),它会正确上传文件,但不会呈现 waiting.html 页面。
如果我将其更改为:response = make_response(render_template('waiting.html')),它将呈现模板,但不会下载该文件。

是否有方法同时执行这两项操作?

1 个答案:

答案 0 :(得分:3)

简短回答:不。显然,你不能立刻回复不同的回答。

快速而肮脏的解决方案是使用" waiting.html"返回HTML响应。模板,并从此模板添加一些JavaScript以启动下载。

注意这与使用BTW无关,你在任何服务器端语言/技术上都有相同的行为。这就是HTTP的工作方式。