このイングリッシュによれば、HTTP2ヘッダーに改行してはいけないということです。Content Security Policy (CSP)は長いので見やすいよう沢山改行していたのが仇となりました。こんなつまらないことで1日も悩まされるなんて、PUBGで5回TKされたほうがマシな感じがしました。
大きな変更点はあまり見られず、デザインも0から作った割には前作をインスパイアーにオマージュしたので毛が一本生えた程度ですが、内部構成、管理画面はかなり変わっていますので、前回まで記事更新に3度手間をかけていたのを1手間に改良したので、更新しやすくなり、たくさん更新していきたいと思います。
大前提としてエロジンは自動車のエンジンのように、高速で表示されるエロサイトという目的で作られました。ということでWEB上で高速に表示されるためにはどうすればいいか考えます。それは何もしないということです。
つまりサイトが表示される時に無駄な計算をせず、そのまま作ってある状態のテキストを置いておくだけという単純な仕組みを提案しました。ブログというのはタイトルや本文、タグなどのテキスト(HTML)を投稿した日付の順番に、1つのページに30件表示されるのが一般的です。
最初のトップページ//kvartira-sib.ruに30件の記事を投稿順に置きます。そして全記事数/30を1ページごとに小数点繰り上げで分割します。例えば全記事数が60件だった場合、全部で2ページあれば十分ですが62件だった場合、30で割ると2.0666と無理数整数になりません。3ページ必要なので小数点は切り上げなければなりません。切り上げるのに適したモジュールが用意されていますが原始的な方法を使ったほうがパフォーマンスが上昇するのでこのようにします。
ユーザーが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="/" alt="a">がある場合、m.group(1)には『class="imgs" 』が入っている。