对于我的个人网站,我想要一个单独的页面,仅用于我的简历,这是一个PDF。我尝试了多种方法,但我无法弄清楚如何让烧瓶处理PDF。
答案 0 :(得分:28)
由于他们尝试使用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
如果您希望下载文件而不是在浏览器中显示,可以将内容处置从“内联”更改为“附件”。您也可以将此视图放在子域中,例如docs.yourapp.com而不是yourapp.com/docs。最后一步是将此文档实际嵌入浏览器中。在您想要的任何页面上,只需使用rawrgulmuffin的策略:
<embed src="/docs/pdfid8676etc" width="500" height="375">
你甚至可以使用Jinja2模板使src动态化。我们把它放在doc.html中(注意大括号):
<embed src="/docs/{{doc_id}}">
然后在视图函数中,您只需返回带有相应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)
这将使用简单的GET请求从数据库中嵌入用户请求的文档。希望这可以帮助任何在数据库中处理大量PDF的人!
答案 1 :(得分:8)
您有两种选择。您可以渲染使用静态PDF文件的模板,也可以渲染生成PDF的模板。我个人会选择第一个选项。
这是一种快速而肮脏的方法来完成它。
<embed src="http://yoursite.com/the.pdf" width="500" height="375">
或者,您可以创建一个jinja2模板,该模板设置返回PDF所需的所有标题,然后说,
<img src="{{ url_for('static', filename='img.png', _external=True) }}" />
使用名为static的视图函数返回pdf。
You can read more about the second option at this flask snippet
答案 2 :(得分:6)
您可以在 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')
如果您想要从某个目录发送文件,也可以使用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')
read more关于send_from_directory
答案 3 :(得分:1)
我知道已经很晚了,但是我只是找到了最简单的方法,而且不在其中。
只需作为静态文件重定向到文件的路径,并带有任何超链接:
"/docs/sample.pdf" #the browser will take care about showing it
或者,如果您想采用一种更清洁的方式...我刚刚为pdf制作了一个烧瓶页面,如下所示:
@app.route('/pdf/') #the url you'll send the user to when he wants the pdf
def pdfviewer():
return redirect("/docs/sample.pdf") #the pdf itself
...我想这有点像为pdf链接赋予一个变量名(?),如果我需要根据变量将用户发送到不同的pdf,也应该更容易适应。
我在想这方面的事情:
@app.route('/pdf<number>') #passing variable through the url
def pdfviewer(number):
if number == 1: #pdf depending on that variable
return redirect("/docs/sample1.pdf")
elif number == 2:
return redirect("/docs/sample1.pdf")
...
else:
return "Hey I don't have such pdf" #basic html page as default
顺便说一句:我正在pythonAnywhere上工作,因此我必须首先在“ Web”选项卡中定义static files
的路径,以便向用户显示静态文件。
答案 4 :(得分:0)
如果您尝试做典型的
<a href="path/doc.pdf">My Resume</a>
用户点击链接并下载pdf时,您需要将文档放在静态文件夹中。
然后你会得到类似的东西:
<a href="../static/doc.pdf">My Resume</a>