初めに
本記事はDjangoで作成されたWebアプリケーションのページを、pdfkitというライブラリで出力する記事の目次です。
一番簡単な出力方法からオプションの指定、障害発生とその対策までいくつかの記事にまとめています。
これらを参考にしてページをpdf化させましょう!
環境
名称 | バージョン |
---|---|
Python | 3.10.4 |
Django | 4.0.6 |
pdfkit | 1.0.0 |
基本編
【Django】ページをPDF出力する(基本)【Python】
応用編
【Django】ページをPDF出力する(オプション)【Python】
セッション編
【Django】ページをPDF出力する(セッション)【Python】
障害対応編
【Django】ページをPDF出力する(障害対応)【Python】
追加検証編
※上記全てを読んでいただいた上で後日談的なものとしてお読みください。
障害対応の中で、セッションに格納した値を出力して確認しました。
実は以下のような確認方法も試しました。
def to_pdf_alone(request):
# idを受け取る
id = request.POST.get('id')
# idをセッションにセットする
request.session['id'] = id
# セッションを保存する
# request.session.save()
url = 'http://127.0.0.1:8000/test_app/detail/'
cookie_list = request.COOKIES
options = {
'cookie': [
('sessionid', cookie_list['sessionid']),
]
}
print(f'セッションにセットした値: {(id)}') #セッションの値を確認
session_id = request.session.get('id')
print(f'セッションからすぐ取り出した値: {(session_id)}') #セッションの値を確認
pdfkit.from_url(url, 'sample.pdf', options=options)
return redirect('test_app:index')
def detail(request):
# idをセッションから受け取る
id = request.session.get('id')
print(f'セッションから取り出した値: {id}') #セッションの値を確認
# idをキーにDBアクセス
person = Person.objects.filter(id=id)
context = {'item': {'id': person[0].id, 'first_name': person[0].first_name, 'last_name': person[0].last_name}}
return render(request, 'test_app/detail.html', context)
自身でセッションに値を格納後、すぐに取り出して中身を確認します。
当然pdfkitと同じ出力結果になると思いましたが、障害対応編の2回目のユーザ操作を実施すると以下のようになりました。
セッション格納後直後に取り出すと値は更新されています。
その後pdfkitがセッションから取得した値は更新前の値となります。
考察
まず、自身が取得した値はDB由来でないことは間違いなく、pdfkitとは参照場所は違うはずです。
参照場所はメモリとかでしょうか?
自身がセッションに格納した値を、同関数内で取得することを想定した仕様のように見えますが、
そのような処理が必要な場面があるのでしょうか。あまり想像できません。
何か理由を知っている方がいたらご教授ください。
まとめ
セッションやcookie周りはWebアプリケーションに欠かせない要素なので、このような検証、
という名の遊びを通して学ぶのも良いかと思います。