SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Pythonで学ぶバックエンド開発

【トップページを実装しよう!】PythonとSQLで実装する「ホームページ」の仕組み

Pythonで学ぶバックエンド開発 第6回

5件ずつ記事のページを遷移する

 ホームページで一度に見られる記事は5件までです。それより古い記事を見るためには、5件ずつ記事を遡るページ遷移の仕組みが必要です。これは、GETパラメータのselectにページ番号を指定することで実現します。たとえば、select=1なら最新の5件、select=2なら6件目から10件目の記事、といった形です。

複数ページの記事一覧を選べる番号を表示したホームページ
複数ページの記事一覧を選べる番号を表示したホームページ

home.pyファイルをコーディングする

 5件ごとの記事のWebページを遷移するといっても同じhome.pyのWebページへ遷移します。ただしselectパラメータが違うので表示される記事のレコードが異なります。

 新たに出てきたSQL文は「article」テーブルのレコード数(COUNT)を取得するだけです。「fetchone」メソッドで1レコードだけ取得します。カラムは配列に入れられるので「count[0]」にレコード数が取得できます。

サンプルコード「pages」→「home.py」ファイル
import pages.etc as etc

def html(form,cur):
  select = int(form.getfirst('select', '1'))

  print('''
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>一筆書きBBS</title>
  <link href="css/pc.css" rel="stylesheet" type="text/css" />
  <link href="css/mobile.css" rel="stylesheet" type="text/css" media="only screen and (max-width:1023px)" />
  <script type="text/javascript" src="js/main.js"></script>
</head>
<body>

<div id="left">
  <header>
    <h1>一筆書きBBS</h1>
    <nav>
      <a href="?page=home">HOME</a>
      <a href="?page=draw">DRAW</a>
      <a href="?page=about">ABOUT</a>
    </nav>
  </header>
  <h2>記事</h2>
  <ul>
  ''')

  title = ''
  speaker = ''
  date = ''
  ARTICLE_NUM = 5
  data = (ARTICLE_NUM,(select-1)*ARTICLE_NUM)
  sql = '''SELECT id,title,speaker,date FROM article ORDER BY id DESC LIMIT ? OFFSET ?''' #
  for row in cur.execute(sql,data):
    if row[0] != None:
      id = row[0]
    if row[1] != None:
      title = etc.get_html(row[1])
    if row[2] != None:
      speaker = etc.get_html(row[2])
    if row[3] != None:
      date = row[3]
    print('''
    <li><a href="?page=comment&article_id={}">{}</a><br />{}<br />{}</li>
    '''.format(id,title,date,speaker))
  print('</ul>')
 
  print('<div id="select">')
  sql = 'SELECT COUNT(id) FROM article'
  cur.execute(sql)
  count = cur.fetchone()
  for i in range(1,2+int((count[0]-1)/ARTICLE_NUM)):
    if i == select:
      print('<a href="?page=home&select={}" id="select_num">{}</a> '.format(i,i))
    else:
      print('<a href="?page=home&select={}">{}</a> '.format(i,i))
  print('</div>')

  etc.random_load(cur)

サンプルコードの解説

 SQL文でarticleテーブルの「id」カラムのレコード数(COUNT)を取得(fetchoneメソッド)します。

 記事の5件ずつのページ番号を1~ページの総数だけ繰り返しその番号のリンクをHTML5文書に出力します。ページ番号が現在のページの場合「#select_num」セレクタで背景色の黒いcssにします。

コラム「Webプログラミング」

 コンパイラ言語である「Visual C++」が全盛だった時代からプログラミングに携わっていたため、当初は「インタプリタ言語は処理速度の面で実用的ではない」という先入観があり、Webアプリケーション開発を敬遠していた時期がありました。 しかし、現在はPythonやJavaScriptといったインタプリタ言語を中心に開発を行っています。Webアプリケーション開発への取り組みが遅れたことを少し後悔していますが、今やそれも昔の話かもしれません。

おわりに

 今回は、一筆書きBBSのホームページ(トップページ)を作成しました。記事タイトルからコメントページへのリンク(?page=comment)を設置しましたが、まだindex.pyがこのpageパラメータに対応していないため、リンクをクリックしても(else節が実行され)ホームページが表示される状態です。

 次回は、この記事一覧からリンクするコメントページを作成します。

この記事は参考になりましたか?

Pythonで学ぶバックエンド開発連載記事一覧

もっと読む

この記事の著者

大西 武(オオニシ タケシ)

 1975年香川県生まれ。大阪大学経済学部経営学科中退。プログラミング入門書などを30冊以上商業出版する作家。ドコモでグランプリなどコンテストに20回以上入賞するアーティスト。オリジナルの間違い探し「3Dクイズ」がTVで約10回出題。プロフィールサイト:https://profile.vixar.jp

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

CodeZine編集部(コードジンヘンシュウブ)

CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/22089 2025/10/29 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング