Uwaga dla każdego, kto przyszedł na to pytanie, ponieważ próbują służyć plików PDF z bazy danych z kolbą. Osadzanie pliku PDF, gdy plik jest przechowywany w bazie danych, nie jest tak proste jak w folderze statycznym. Musisz użyć funkcji make_response
i nadać jej odpowiednie nagłówki, aby przeglądarka wiedziała, co zrobić z binarnymi danymi PDF, a nie tylko zwracała je z funkcji widoku, jak normalnie. Oto niektóre Pseudokod pomóc:
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
Można zmienić Content-Disposition z „inline” do „przywiązania”, jeśli chcesz pobrać plik zamiast wyświetlania w przeglądarce. Możesz też umieścić ten widok w poddomenie, np. docs.yourapp.com zamiast yourapp.com/docs. Ostatnim krokiem jest faktyczne osadzenie tego dokumentu w przeglądarce. Na każdej stronie, którą chcesz, wystarczy użyć strategii rawrgulmuffin za:
<embed src="/docs/pdfid8676etc" width="500" height="375">
Można nawet zrobić src dynamiczny z szablonem Jinja2. Ujmę to w doc.html (zwróć uwagę na klamrowych):
<embed src="/docs/{{doc_id}}">
Następnie w funkcji widoku, po prostu wrócić renderowany szablon z odpowiednim 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)
To osadza udokumentować użytkownik żądany z bazy danych za pomocą prostego żądania GET. Mam nadzieję, że to pomoże każdemu pracować z dużą ilością plików PDF w bazie danych!
Czy można uzyskać serwer WWW do statycznego wyświetlania pliku (tak jak prawdopodobnie robisz dla swoich plików '/ static' mimo to). Jeśli tak, czy możesz utworzyć łącze w aplikacji Flask do pliku statycznego? –