ユーザーが2ページ目にアクセスしたとき、日付順から30件スキップした31件目から60件目までを表示させれば、インデックスページは完成です。ここでようやく動的な計算をしていますが、ページだけなので大した処理はしてません。
静的に表示すれば確かに軽量にできますが、後から追加されるコメントや評価などを更新するためにHTMLを都度変更していかなければなりません。例えばYouTubeの動画にコメントすると即時反映されページを更新するとコメントは追加されたままです。静的なサイトでは何かしらイベントを起こさないと反映されません。コメント投稿時にHTML更新するということを考えましたが、Nginxファイルキャッシュによってキャッシュ情報に相違が生じるとエラーを起こしてしまうので断念しました。臨時対処法としてCronTabで12時間ごとに自動更新させています。
本題の改良点は、このCronTabで自動実行のプログラムは、実行するごとに全記事のHTMLファイルを生成するというところにあります。画像に△0の評価ボタンを付けてしまったため、全記事の本文から画像タグ<imgのsrcURLを抽出して、そのURLに与えられた評価を別データベースで取得するという極めて面倒な作業をしています。
posts = list(db.posts.find())
for post in posts:
post['content'] = re.sub(r'<img ([^>]*)src="([^"]+)"([^>]+)>', appendVote, post['content'])
def appendVote(m):
1行目:データベースから全ての記事を配列にして変数postsに格納
2行目:全ての記事を1記事としてループ、つまりpostにはposts[0]最初の記事が入っている
3行目:post['content']は記事本文のことで、それをappendVote関数に置換する。
5行目:置換関数、変数mには記事本文の中に入っている<imgタグの後方参照を取得できる。例えば記事本文にlt;img class="imgs" src="https://aa.jpg" alt="a">がある場合、m.group(1)には『class="imgs" 』が入っている。
日付 | 2018-01-31T15:10:00 |
分類 | お知らせ |
画像 | 1枚 |
訪問数 |