SHOEISHA iD

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

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

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

【PythonとJavaScriptのデータ連携】座標をPOSTしてSQLiteへ保存する総仕上げ

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

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

はじめに

 今回でこの「Pythonで学ぶバックエンド開発」の連載は最終回です。今回は連載の総仕上げとして、お絵描きのベジェ曲線データをデータベースに保存する機能を実装します。あわせて、作品のタイトルや作者名、コメントも保存できるようにします。

 なお、前回までに作成したcss/mobile.cssindex.pybezierbbs.dbなどのファイル群がすでに存在することを前提に進めます。今回もこれらのファイルにコードを追記し、機能を拡張していきます。

お絵描きページを用意する

 本項のサンプルコードを実装し、トップページの「DRAW」メニューへアクセスすると、次の図のようなお絵描きページが表示されます。このページでは既存のデータを表示するのではなく、キャンバスに新規に絵を描画できます。

テンプレートのお絵描きページ
テンプレートのお絵描きページ

「pages」→「draw.py」ファイルをコーディングする

 お絵描きページは、pagesディレクトリ内のdraw.pyファイルにて、html関数を用いて出力します。ここでは定型的な<html>タグ、<head>タグ、<body>タグなどを定義します。

サンプルコード「pages」→「draw.py」ファイル
def html(form,con,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">
  <header>
    <h1>お絵描き</h1>
    <nav>
      <a href="?page=home">HOME</a>
      <a href="?page=draw">DRAW</a>
      <a href="?page=about">ABOUT</a>
    </nav>
  </header>
''')

「index.py」ファイルを実装する

 以下のサンプルコードをindex.pyファイルに記述します。実装後はXAMPPなどのWebサーバを起動し、ブラウザからindex.pyへアクセスして動作を確認してください。なお、macOSやLinux環境の場合は、index.pyに実行権限(パーミッション)を付与する必要があります。

 index.pyの後半では、draw.pyで生成されたHTMLの続きが出力されます。実際にどのようなHTMLがブラウザに送信されたかは、ブラウザの「ページのソースを表示」機能などで確認できます。

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

import cgi
import sys
import io
import sqlite3
import pages.comment as comment
import pages.draw as draw
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 == 'comment':
  comment.html(form,con,cur)
elif page == 'draw':
  draw.html(form,con,cur)
elif page == 'about':
  about.html(cur)
else:
  home.html(form,cur)

cur.close()
con.close()

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

サンプルコードの解説

 1行目のShebang(シェバン)は、ご自身の環境に合わせてパスを変更してください(macOSやLinuxでは#!/usr/local/bin/python3.12など)。

 pagesディレクトリのdraw.pyを、drawモジュールとしてインポート(as)します。標準出力のエンコーディングをUTF-8に設定し、日本語の文字化けを防ぎます。

 「FieldStorage」関数と「getfirst」メソッドを使用し、GETリクエストの「page」パラメータを取得します。

 データベースファイル「bezierbbs.db」への接続とカーソルの取得は、前回と同様の手順です。

 Content-Typeヘッダを出力し、このHTML5文書がhtml文であることを出力してを宣言します。

 取得したpageパラメータの値に応じて、各モジュール(draw, comment, about, home)のhtml関数を条件分岐で呼び出します。

 処理終了後、データベース接続を閉じます。

 HTML5文書の末尾部分を出力します。

次のページ
お絵描きデータをPOSTする

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

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

もっと読む

この記事の著者

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

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

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

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/22091 2025/12/04 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング