SHOEISHA iD

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

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

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

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

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

 本連載では、ベジェ曲線でお絵描きするWebアプリを使って、描いた絵を公開できる掲示板を開発しながら、Pythonを使ったバックエンド開発について学んでいきます。連載第6回は、PythonでSQLite3のデータベースを使った「一筆書きBBS」のWebサイトの「ホームページ」の作成方法を解説します。

はじめに

 今回は「ホームページ」を作ります。一般的に、かつてはWebサイト全体を「ホームページ」と呼ぶことがありましたが、英語圏では主にトップページのことを指します。この記事で作成する「一筆書きBBSのホームページ」は、トップページにあたり、タイトル、メニュー、記事のタイトル一覧、ランダムに選ばれた一筆書きの絵が表示されます。

 前回に引き続きコードを追記します。そのため「index.py」ファイル、「pages」→「about.py」ファイル、「pages」→「etc.py」ファイル、「bezierbbs.db」ファイル、cssファイル、jsファイルが既に存在することを前提として説明を進めます。

ホームページを用意する

 はじめに記事のタイトル一覧をまだ表示しない状態のホームページを作成します(下の図を参照)。コードの多くは前回と似ていますが、今回は新たにURLから「GET」で渡された「page」パラメータを取得します。pageパラメータが「home」または空の場合は「home.py」ファイルの「html」関数を呼び出します。

まだ記事一覧のないホームページ
まだ記事一覧のないホームページ

.pyファイルをCGIとして動作させる設定

 「.htaccess」ファイルを用意し、.pyファイルをCGIスクリプトとして実行できるように設定します。この設定がないと、pyファイルはスクリプトとして実行されません。なお、Webサーバーの設定ファイル(「httpd.conf」ファイルなど)に同様の設定を記述することで、プロジェクトごとに.htaccessファイルを用意する必要はなくなります。しかし、サーバー全体の重要な設定ファイルを誤って変更するリスクを避けるため、今回は.htaccessファイルを使用します。

「.htaccess」ファイル
AddHandler cgi-script .py
DirectoryIndex index.py

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

 次に「pages/home.py」ファイルを作成します。この「html」関数は、ホームページのHTML5文書の前半部分(headタグ、htmlタグ、bodyタグの開始部分など)を出力します。 このように1つのHTML5文書を複数の関数に分割して出力する手法は、常に最適とは限りません。特に、ページごとにWebデザインが大きく異なる場合は、分割しない方が管理しやすいこともあります。

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

def html(form,cur):
  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">
  ''')

  etc.random_load(cur)

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

 次のサンプルコード「index.py」をコーディングしたら、XAMPPのローカルサーバーを起動し、Webブラウザで「index.py」にアクセスしてください。macOSやLinuxの場合は、「index.py」に実行権限(パーミッション)を与える必要があります。

 「index.py」の後半(home.pyのhtml関数呼び出し後)で、HTML5文書の残りの部分が出力されます。最終的にどのようなHTML5文書がWebブラウザに送信されたかは、ブラウザの「ページのソースを表示」などのメニューから確認できます。

サンプルコード「index.py」ファイル
#!C:\Users\ユーザー名\AppData\Local\Programs\Python\Python312\python.exe

import cgi
import sys
import io
import sqlite3
import pages.about as about
import pages.home as home

#日本語があってもエラーにならないように
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

form = cgi.FieldStorage()
page = form.getfirst('page', '')

con = sqlite3.connect('bezierbbs.db')
cur = con.cursor()

print('Content-Type: text/html; charset=utf-8\n\n')

if page == 'about':
  about.html(cur)
else:
  home.html(form,cur)

cur.close()
con.close()

print('''
(中略)
''')

サンプルコードの解説

 シェバンのところはご自分のユーザー名にしてください。またmacOSやLinuxでは「#!/usr/local/bin/python3.12」などになります。

 新たに「cgi」モジュールも読み込みます。「pages」→「home.py」を「home」モジュールとして(as)読み込みます。

 UTF-8で日本語に対応します。

 「FieldStorage」関数と「getfirst」メソッドでGETしたpageパラメータを取得します。

 「bezierbbs.db」ファイルを読み込むところは前回と同じでコネクトしてカーソルを取得します。

 このHTML5文書がhtml文であることを出力して明示します。このようにhtmlファイルで送らずHTML5文書を出力する際はhtml文であることを明示しなければなりません。

 GETしたURLのpageパラメータ次第でaboutモジュールやimportしたhomeモジュールのhtml関数を呼び出します。

 データベースを閉じます。

 HTML5文書の残りを出力します。

次のページ
記事一覧を表示する

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング