Một lưu ý cho bất cứ ai đến câu hỏi này bởi vì họ đang cố gắng để phục vụ tập tin PDF từ một cơ sở dữ liệu với Flask. Nhúng PDF khi tệp được lưu trữ trên cơ sở dữ liệu không đơn giản như khi nó nằm trong thư mục tĩnh. Bạn phải sử dụng hàm make_response
và cung cấp cho nó tiêu đề thích hợp để trình duyệt biết phải làm gì với dữ liệu PDF nhị phân của bạn, thay vì chỉ trả lại từ chức năng xem như bình thường. Dưới đây là một số giả để giúp:
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
Bạn có thể thay đổi Content-Disposition từ 'inline' thành 'đính kèm' nếu bạn muốn các tập tin tải chứ không phải hiển thị trong trình duyệt. Bạn cũng có thể đặt chế độ xem này trong tên miền phụ, ví dụ: docs.yourapp.com thay vì yourapp.com/docs. Bước cuối cùng là thực sự nhúng tài liệu này vào trình duyệt. Trên bất kỳ trang nào bạn muốn, chỉ cần sử dụng chiến lược rawrgulmuffin:
<embed src="/docs/pdfid8676etc" width="500" height="375">
Bạn thậm chí có thể làm cho src động với mẫu Jinja2. Hãy đặt này trong doc.html (chú ý dấu ngoặc nhọn):
<embed src="/docs/{{doc_id}}">
Sau đó, trong một chức năng xem, bạn chỉ cần trả lại mẫu render với doc_id thích hợp:
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)
này nhúng một tài liệu các người dùng được yêu cầu từ cơ sở dữ liệu với yêu cầu GET đơn giản. Hy vọng điều này sẽ giúp bất kỳ ai làm việc với nhiều tệp PDF trong cơ sở dữ liệu!
Bạn có thể yêu cầu máy chủ web phân phát tệp tĩnh (như bạn có thể đang làm cho tệp '/ static' của mình). Nếu có, bạn có thể tạo liên kết trong ứng dụng Flask của mình với tệp tĩnh không? –