小智 30
这个问题的任何人都应该注意,因为他们正在尝试使用Flask从数据库中提供PDF文件.在文件存储在数据库中时嵌入PDF并不像在静态文件夹中那样简单.您必须使用该make_response函数并为其提供适当的标题,以便浏览器知道如何处理二进制PDF数据,而不是像正常情况一样从视图函数返回它.这里有一些伪代码可以帮助:
from flask import make_response
@app.route('/docs/<id>')
def get_pdf(id=None):
if id is not None:
binary_pdf = get_binary_pdf_data_from_database(id=id)
response = make_response(binary_pdf)
response.headers['Content-Type'] = 'application/pdf'
response.headers['Content-Disposition'] = \
'inline; filename=%s.pdf' % 'yourfilename'
return response
Run Code Online (Sandbox Code Playgroud)
如果您希望下载文件而不是在浏览器中显示,则可以将内容处置从"内联"更改为"附件".您也可以将此视图放在子域中,例如docs.yourapp.com而不是yourapp.com/docs.最后一步是将此文档实际嵌入浏览器中.在您想要的任何页面上,只需使用rawrgulmuffin的策略:
<embed src="/docs/pdfid8676etc" width="500" height="375">
Run Code Online (Sandbox Code Playgroud)
您甚至可以使用Jinja2模板使src动态化.我们把它放在doc.html中(注意大括号):
<embed src="/docs/{{doc_id}}">
Run Code Online (Sandbox Code Playgroud)
然后在视图函数中,您只需使用适当的doc_id返回呈现的模板:
from flask import render_template
@app.route('/<id>')
def show_pdf(id=None):
if id is not None:
return render_template('doc.html', doc_id=id)
Run Code Online (Sandbox Code Playgroud)
这通过简单的GET请求嵌入用户从数据库请求的文档.希望这可以帮助任何在数据库中处理大量PDF的人!
你有两个选择.您可以渲染使用静态PDF文件的模板,也可以渲染生成PDF的模板.我个人会选择第一个选项.
这个SO问题专门用于编写返回PDF的HTML页面.您可以在jinja2模板中使用它.
这是一个快速而肮脏的方法来完成它.
<embed src="http://yoursite.com/the.pdf" width="500" height="375">
Run Code Online (Sandbox Code Playgroud)
或者,您可以创建一个jinja2模板,该模板设置返回PDF所需的所有标题,然后说,
<img src="{{ url_for('static', filename='img.png', _external=True) }}" />
Run Code Online (Sandbox Code Playgroud)
使用一个名为static的视图函数返回pdf.
您可以使用5行中的烧瓶send_file或send_static_file功能:
from flask import send_file, current_app as app
@app.route('/show/static-pdf/')
def show_static_pdf():
with open('/path/of/file.pdf', 'rb') as static_file:
return send_file(static_file, attachment_filename='file.pdf')
Run Code Online (Sandbox Code Playgroud)
此代码段链接很有帮助
send_from_directory如果你想从某个目录发送文件也可以使用:
from flask import send_from_directory, current_app as app
@app.route('/show/PDFs/')
def send_pdf():
return send_from_directory(app.config['UPLOAD_FOLDER'], 'file.pdf')
Run Code Online (Sandbox Code Playgroud)
了解更多send_from_directory
| 归档时间: |
|
| 查看次数: |
19884 次 |
| 最近记录: |