Это пример того, как создать отчет в формате PDF из базы данных MySQL с помощью Python Flask. Будет создано веб-приложение, используя легкий веб-фреймворк Пайтон Flask. Мы будем генерировать PDF-файл на лету из базы данных MySQL в этом веб-приложении. Ссылка для скачивания будет предоставлена во внешнем интерфейсе или пользовательском интерфейсе, по которой конечные пользователи щелкнут и получат возможность сохранить сгенерированный файл PDF в соответствии с выбранным местом.
Мы собираемся использовать API fpdf для создания отчета в формате PDF. Поскольку мы не сохраняем этот PDF-отчет где-либо в физическом расположении сервера, мы отправим данные в объекте Response в виде вложения.
Отчеты в основном создаются в формате PDF, поскольку файл PDF является документом «только для чтения», который нельзя изменить, не оставив электронного следа, в то время как другие форматы, такие как изображение,слово,Excel и т.д.,можно легко изменить,
не оставив электронного следа.
Ниже Я старался как можно более детально описать файловую конфигурацию для правильной работы Flask и Пайтон код app.py, db.py, main.py и положение download.html
Installation - Use pip to install flask-mysql
: pip install flask-mysql ( in venv )
(.env) boris@boris-All-Series:~/flaskproject$ ls -CRl
.:
total 24
-rw-rw-r-- 1 boris boris 46 июл 27 14:01 app.py
-rw-rw-r-- 1 boris boris 304 июл 27 14:00 db.py
drwxrwxr-x 3 boris boris 4096 июл 27 13:43 download
-rw-rw-r-- 1 boris boris 1462 июл 27 14:09 main.py
drwxrwxr-x 2 boris boris 4096 июл 27 14:05 __pycache__
drwxrwxr-x 2 boris boris 4096 июл 27 13:55 templates
./download:
total 4
drwxrwxr-x 2 boris boris 4096 июл 27 14:10 report
./download/report:
total 4
-rw-rw-r-- 1 boris boris 1980 июл 27 14:10 employee_report.pdf
./__pycache__:
total 8
-rw-rw-r-- 1 boris boris 182 июл 27 14:02 app.cpython-38.pyc
-rw-rw-r-- 1 boris boris 409 июл 27 14:05 db.cpython-38.pyc
./templates:
total 4
-rw-rw-r-- 1 boris boris 199 июл 27 13:46 download.html
=====================================
(.env) boris@boris-All-Series:~/flaskproject/templates$ cat download.html
<!doctype html>
<title>Python Flask File Generate PDF Report from MySQL</title>
<h2>Generate PDF Report from MySQL</h2>
<p>
<a href="{{ url_for('.download_report') }}">Generate Pdf Report</a>
</p>
from flask import Flask
app = Flask(__name__)
=====================================
(.env) boris@boris-All-Series:~/flaskproject$ cat db.py
from app import app
from flaskext.mysql import MySQL
mysql = MySQL()
# MySQL configurations
app.config['MYSQL_DATABASE_USER'] = 'root'
app.config['MYSQL_DATABASE_PASSWORD'] = '*********'
app.config['MYSQL_DATABASE_DB'] = 'roytuts'
app.config['MYSQL_DATABASE_HOST'] = 'localhost'
mysql.init_app(app)
=================================
(.env) boris@boris-All-Series:~/flaskproject$ cat main.py
import pymysql
from app import app
from db import mysql
from flask import Flask, Response, render_template
from fpdf import FPDF
@app.route('/')
def upload_form():
return render_template('download.html')
@app.route('/download/report/pdf')
def download_report():
conn = None
cursor = None
try:
conn = mysql.connect()
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute("SELECT emp_id, emp_first_name, \
emp_last_name, emp_designation FROM employee")
result = cursor.fetchall()
pdf = FPDF()
pdf.add_page()
page_width = pdf.w - 2 * pdf.l_margin
pdf.set_font('Times','B',14.0)
pdf.cell(page_width, 0.0, 'Employee Data', align='C')
pdf.ln(10)
pdf.set_font('Courier', '', 12)
col_width = page_width/4
pdf.ln(1)
th = pdf.font_size
for row in result:
pdf.cell(col_width, th, str(row['emp_id']), border=1)
pdf.cell(col_width, th, row['emp_first_name'], border=1)
pdf.cell(col_width, th, row['emp_last_name'], border=1)
pdf.cell(col_width, th, row['emp_designation'], border=1)
pdf.ln(th)
pdf.ln(10)
pdf.set_font('Times','',10.0)
pdf.cell(page_width, 0.0, '- end of report -', align='C')
return Response(pdf.output(dest='S').encode('latin-1'), \
mimetype='application/pdf', \
headers={'Content-Disposition':'attachment; \
filename=employee_report.pdf'})
except Exception as e:
print(e)
finally:
cursor.close()
conn.close()
if __name__ == "__main__":
app.run()
No comments:
Post a Comment