さんまがおいしい季節だねー(´・ω・`)

コピペで覚える Python CGI の作り方

CGI,Python — タグ: , — さくら @ 2009/11/03 0:09

ちょっと前にツイッターで @kira88 たんから Python の記事のリクエストを受けたのですが、フォーマルな解説記事はその辺にいっぱいあるので、とりあえず例だけ貼っとこうかと思います。他の言語ご存知の方は、こっちの方が手っ取り早いでしょうww

コピペ元の前に、Windows の開発環境が必要な方はこちらが参考になるかと思いますが、ポックンうにっくす系メインなので詳しくは分かりません><

MOONGIFT: » Python開発をはじめたいWindows開発者は「Portable Python」:オープンソースを毎日紹介

Hello, World! 風

つーことでまずは Hello, World! 風 CGI。

#!/usr/local/bin/python

import cgi

def main():
    form = cgi.FieldStorage()
    name = form.getfirst("name", "")

    print "Content-Type: text/html; charset=utf-8"
    print
    print "<html><body>"
    if name:
        print "<p>Hello, %s</p>" % cgi.escape(name)
    print "<form method=\"post\">"
    print "<input type=\"text\" name=\"name\" value=\"%s\" />" % name
    print "<input type=\"submit\" />"
    print "</form>"
    print "</body></html>"

if __name__ == "__main__":
    main()

細かい説明とか…
要る?

MySQL で登録とか

Python で MySQL を使用する場合は MySQL for Python とかが要ります。(とかってのは、他にも MySQL 用のモジュールがあるよって意味です。)

レン鯖とかだと MySQL for Python モジュールを自分でインスコする必要があるかもしれませんが、さくらインターネットのように SetEnv できない環境だと、モジュール入れた後の設定が結構マンドクサイです。この辺については PYTHONPATHの挙動を正確に把握する – ぎじゅっやさん をご覧ください。

んでスクリプトの前に使ってるテーブルはこんな感じ。この辺手抜きなのは所詮サンプルですおww

CREATE TABLE test (name VARCHAR(200) PRIMARY KEY) CHARSET=utf8;

んで test テーブルを一覧表示してインスコするスクリプト。このスクリプトは日本語を含んでまして UTF-8 で動くようになってますので、ファイルの文字コードは UTF-8 にして保存してください。先頭の coding: utf-8 はいわゆる魔法の呪文ですww それと MySQLdb.connect の引数は、データベースの設定によって変える必要があります。

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import cgi
import os
import MySQLdb

def connect():
    return MySQLdb.connect(user='USER', passwd='PASSWD', db='DBNAME',
                           host='HOSTNAME', charset='utf8')

def get(form):
    conn = connect()

    print "Content-Type: text/html; charset=utf-8"
    print
    print "<html><body>"

    # 一覧表示
    cur = conn.cursor()
    cur.execute("SELECT name FROM test ORDER BY name")
    print "<ul>"
    for name, in cur:
        print "<li>%s</li>" % (name.encode("utf-8"))
    print "</ul>"

    # 登録用フォーム
    print """<form method="post">
            <input type="text" name="name" value="%s" />
            <input type="submit" />
        </form>""" % (cgi.escape(form.getfirst('name', '')))

    print "</body></html>"

def post(form):
    name = form.getfirst('name')
    if not name:
        get(form)
        return

    # DB に登録
    # キー重複したら 500 になるお
    conn = connect()
    cur = conn.cursor()
    cur.execute("INSERT INTO test (name) VALUES (%s)",
                (name.decode('utf-8'), ))

    # 結果表示みたいな
    print "Content-Type: text/html; charset=utf-8"
    print
    print "<html><body>"
    print "<p>登録しますた</p>"
    print("<p><a href=\"%s\">戻る</a></p>" %
          (cgi.escape(os.getenv("SCRIPT_NAME"))))
    print "</body></html>"

def main():
    form = cgi.FieldStorage()
    if os.getenv("REQUEST_METHOD") == "POST":
        post(form)
    else:
        get(form)

if __name__ == "__main__":
    main()

これくらい分かったら自分でスクリプト作れると思いますが、たぶんちゃんとした資料が要ると思いますのでリンク貼っときます。

  • Python ドキュメント – Python Japan User’s Group の有志の皆様による翻訳ドキュメント。Python 本体のことはだいたいこれ見れば解決します。
  • Python チュートリアル – 上記の Python ドキュメントに含まれるチュートリアル。ポックンの記事見るよりこっち見るのが正解ww
  • PyPI Python Package Index – Python のパッケージリポジトリ。読み方はパイパイです。大事なことなのでもう一度書きます。
    Python Package Index PyPI の正式な読み方はパイパイですwww
  • その他 – ググレカス!


んじゃ、ぱいぱーいwww

4件のコメント »

  1. 読ませていただいた!
    うーむ、パイパイも読み込んでみるお!
    ありがとありがと!

    コメント by kira88 — 2009 年 11 月 3 日 @ 00:32
  2. お暇なときにでも Python をお試しくださいw

    コメント by さくら — 2009 年 11 月 3 日 @ 01:03
  3. UOmvjiQPNYVkHRtwle 2690

    コメント by FxelIXNlWPjYIQK — 2014 年 10 月 5 日 @ 17:41
  4. I do consider all of the concepts you’ve introduced in your post.
    They are very convincing and can certainly work. Nonetheless, the posts are very quick
    for beginners. Could you please prolong them a little from subsequent
    time? Thank you for the post.

    コメント by Edythe — 2016 年 12 月 6 日 @ 04:17

この投稿へのコメントの RSS フィード。 TrackBack URI

コメントする

Copyright © 2017 さくらたんどっとびーず | powered by WordPress with Barecity