Python 在向用户发送文件之前,先打印一些内容

Python 在向用户发送文件之前,先打印一些内容,python,bottle,Python,Bottle,现在,下面的代码无法返回一个元组,其中包含两个元素,第一个元素是astring,然后是response方法 @app.route( '/file', methods=['POST'] ) def file(): pdata = '' pdata = pdata + '''<img src="/static/img/arrow.gif" align="left">''' return pdata, send_from_directory( filepath,

现在,下面的代码无法返回一个元组,其中包含两个元素,第一个元素是astring,然后是response方法

@app.route( '/file', methods=['POST'] )
def file():

    pdata = ''
    pdata = pdata + '''<img src="/static/img/arrow.gif" align="left">'''
    return pdata, send_from_directory( filepath, filename, as_attachment=True )
@app.route('/file',methods=['POST'])
def文件():
pdata=“”
pdata=pdata+“”
返回pdata,从目录发送(filepath,filename,as_attachment=True)
在我将文件返回给用户之前,让pdata打印一些行的最简单方法是什么


我不想创建一个额外的html模板来打印一些行。

如果您的打印无法输出某些内容,它可能会被您的框架钩住

您可以尝试以下方式打印内容:

  • 使用标准错误
导入系统 打印(pdata,file=sys.stderr)
  • 记录模块
导入日志记录 logging.error(pdata) 使用产量

@app.route( '/file', methods=['POST'] )
def file():

    pdata = ''
    pdata = pdata + '''<img src="/static/img/arrow.gif" align="left">'''
    yield pdata
    for f in send_from_directory( filepath, filename, as_attachment=True ):
        yield f
@app.route('/file',methods=['POST'])
def文件():
pdata=“”
pdata=pdata+“”
产量数据
对于从\u目录发送\u中的f(文件路径,文件名,如\u附件=True):
产量f
IT工作的完整示例:

from bottle import app, get, post, template, route, run

@get('/file')
@post('/file')
def file():

    pdata = '<h3>Hello<h3>'
    pdata = pdata + '''<img src="/static/img/arrow.gif" align="left">'''
    yield pdata
    yield '<br><br>HELLO WORLD'

run(host='localhost', port=8080, debug=True)
从瓶子导入应用程序获取、发布、模板、路线、运行
@获取(“/file”)
@post(“/file”)
def文件():
pdata='你好'
pdata=pdata+“”
产量数据
产生“

你好,世界” 运行(host='localhost',port=8080,debug=True)
如上所述,我尝试将使用发送到“files.html”模板,以便他可以看到html数据输出,然后从那里我使用:

<meta http-equiv="REFRESH" content="5; URL=http://superhost.gr/files/download?filename={{ filename }}">

因此,它可以在相同的回调函数中返回以获取文件。 这就是我能想到的


如果有人有更清晰的解决方案,请让我知道。

在退货前打印(这里的内容)怎么样?如果我在退货前尝试“打印pdata”,它不会打印任何内容。在哪里打印?在服务器日志中?(
print
logger.error
将执行此操作)。或者到浏览器?我只想在浏览器中打印一些东西,一个简单的消息,通知用户他即将收到文件好的,明白了。那么我认为你误解了HTTP的工作原理。每个请求只有一个响应-您不能发送两个响应。(请注意,您可能可以使用足够高级的javascript来实现这一点,但这相当复杂。)您所说的“被瓶子钩住”是什么意思?您确定在视图函数中可以在return语句之前打印字符串吗?我尝试了两种方法,但都没有在浏览器或错误日志中打印任何内容。为什么下面返回元组的语句不起作用
返回pdata,staticοu file(filename,root='/home/nikos/public_html/static/files')
?@Νκόλαοοέργοος我不熟悉您使用的框架,但我的意思是,如果打印无法工作,它可能是由您的框架重定向stdout引起的。如果您只想在浏览器中打印某些内容,您可以阅读框架的文档以了解更多详细信息。您必须将html或js写入浏览器。一个简单的方法是将调试信息放入html中,如
返回的\u html\u str='alert(%s);'%pdata
也许你能帮我解决这个问题?我刚刚尝试了
#准备所选文件供下载。。。filepath='/home/nikos/wsgi/static/files/'yield pdata yield send_from_directory(filepath,filename,as_attachment=True)返回'ok'
但我收到了错误
TypeError:'generator'对象不可调用view函数未返回有效响应。返回类型必须是字符串、元组、响应实例或WSGI可调用,但它是生成器。
您的函数将返回迭代器,对函数使用for循环并生成每个结果。老实说,您应该阅读一些文档,你的许多问题都在文档中得到了回答。我不明白你的意思。用于何处?如果我要<编码>产生<编码>数据并从目录中发送,返回声明必须是什么?请您尽可能简单地向我解释您的建议好吗?下面是我需要执行的功能:
filename=request.form.get('filename')filepath='/home/nikos/wsgi/static/files/'从目录(filepath,filename,as_attachment=True)返回pdata
from bottle import app, get, post, template, route, run

@get('/file')
@post('/file')
def file():

    pdata = '<h3>Hello<h3>'
    pdata = pdata + '''<img src="/static/img/arrow.gif" align="left">'''
    yield pdata
    yield '<br><br>HELLO WORLD'

run(host='localhost', port=8080, debug=True)
filename = request.form.get('filename')         # value comes from posted html form

# Prepare selected file for download...
if request.args:
    filename = request.args.get('filename')         # value comes from template link
    filepath = '/home/nikos/wsgi/static/files/'

    return send_from_directory( filepath, filename, as_attachment=True )

return render_template( 'files.html', authuser=auth.username, filename=filename )
<meta http-equiv="REFRESH" content="5; URL=http://superhost.gr/files/download?filename={{ filename }}">