Python

Python Bottle Framework + Twitter BootStrap + MySQL ベース環境

いろいろな開発で利用できるPython Bottle Frameworkの初期開発環境パッケージを作ってみた。Apache WEBサーバで動作するように作成していますのでご参考ください。Bottleは使った感じがFlaskに似ています。Flaskを使っていた時期もありましたが今はBottleをメインで使っています。

そもそも毎回環境作っていると面倒くさいので最低限の機能をまとめてみました。
ワタシ的には、WEBシステムの開発依頼を受けるとほとんどは、Python Bottleで間に合っています。まれに規模が大きい時はPyramidを使う時はありますが割合的にはPyramidを使うのは2割程度で8割がBottleです。Bottleに必須で足りないのは認証とPagerとメールくらいです。これが揃えば簡単に短期間でプロトタイプが作れます。たまに事情的にPHPで仕事依頼を受ける時がありますが、結構嫌です。といっても結構PHPの割合は依然多いです。やはりPHPのほうがコードの解読性が良くないのでそこが開発上嫌なとこかな。

ページは必要最低限のものしか入っていません。login認証、トップ画面、管理画面パネルのみです。
他の進んだフレームワークのように管理画面のパネルが一気にCRUD機能を自動生成するところまではやっていないので、管理画面は水平メニューしかありません。
ただし、ORM使って簡単にデータ操作行えば管理画面は簡単に作れると思うので皆さん自作してみてください。ここまでbottleの動作ができていればbottle frameworkを使った開発は難しくありません。

Python Framework + Twitter BootStrap + MySQL ベース認証で動作します。認証はわざと難しく作っていませんので自分のアイデアで拡張・改造してみてください。

ユーザ認証はlogin:test@example.com  password:admin01 のデータがデモ用で入っています。
直接DB操作でユーザ登録を行なってください。MySQLで登録する際、MD5関数でパスワードを登録してください

Bottle,Beaker,SQLObjectはeasy_install やpipで落としてください。

同梱物)

Apache Config File –  wsgi-bottle.conf

adapter.wsgi – wsgi with apache interface

index.py –  framework top program

bottle_db.sql –  mysql  db sql create file

Twitter Bootstrap –  css/  js/ img/  view/main.tpl

その他 –  基本プログラム&ファイル

 

Dwonloadはここをクリック

Python WEBアプリをCGIで使う(後編:Part3)

今度はデータベースをSQL文なしで使うORマッパーを利用してデータベースを操作してみよう。
使うのはhttp://sqlobject.org/これはpythonの中でもなかなかわかりやすい
ORマッパーだと思います。CGIレベルで使うのであればこれで十分
Part1のプログラムを改造していじってみます。

まず最初に、MySQLでデータベースの器だけ用意しておきましょう。

[hidy@dev-mar01 py]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12374
Server version: 5.1.69 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> create database test_db;
Query OK, 1 row affected (0.01 sec)

mysql> use test_db
Database changed
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| pyramid_db |
| test_db |
+——————–+
21 rows in set (0.00 sec)

mysql>

この例ではtest_dbというデータベースを作成しました。
次に2つモジュールを導入しましょう。

$ pip install sqlobject
$ pip install MySQL-python

ソースコードを作成します。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import string
import random
import hashlib
from sqlobject import *
import datetime

sqlhub.processConnection = connectionForURI("mysql://test:12345@localhost/test_db")

class WpUserSub(SQLObject):
    default = "CURRENT_TIMESTAMP"
    id_no = StringCol(length=6,notNone="yes",alternateID=True)
    pd_src = StringCol(length=64,notNone="yes",alternateID=True)
    enable = BoolCol(notNone="yes")
    created_at = TimestampCol()

class  Id_gen(object):
    def  __init__(self,stat):
       try:
            WpUserSub.createTable()
            self.__stat = stat
       except:
            self.__stat = stat

    def  inst(self):
       try:
           b = WpUserSub.select().max('id_no')
           b = int(b) + 1
       except:
           b = 1
       data = "%05d" % b
       pw = self.pw_gen(10)
       return {'id_no':data,'enable':self.__stat,'pd_src':pw}

    def  pw_gen(self,length):
       src = string.digits + string.letters
       s=''
       for i in range(1, length):
          s += random.choice("suhvq4v87wrnqweq3b234tb2vNN")
       s = hashlib.md5(s).hexdigest()
       return s

def main():
    p = Id_gen(1)
    print p.inst()['id_no']
    print p.inst()['enable']
    ins = WpUserSub(
        id_no = p.inst()['id_no'],
        pd_src = p.inst()['pd_src'],
        enable = p.inst()['enable'],
    )

if __name__  ==  '__main__':
    main()

導入が完了しましたら実行してみましょう。

# chmod 755 code01.py
# ./code01.py

データベースにアクセスしてテーブルができていればOK

$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12377
Server version: 5.1.69 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> use test_db
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+——————-+
| Tables_in_test_db |
+——————-+
| wp_user_sub |
+——————-+
1 row in set (0.00 sec)

mysql> desc wp_user_sub;
+————+————-+——+—–+——————-+—————————–+
| Field | Type | Null | Key | Default | Extra |
+————+————-+——+—–+——————-+—————————–+
| id | int(11) | NO | PRI | NULL | auto_increment |
| id_no | varchar(6) | NO | UNI | NULL | |
| pd_src | varchar(64) | NO | UNI | NULL | |
| enable | tinyint(1) | NO | | NULL | |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+————+————-+——+—–+——————-+—————————–+
5 rows in set (0.00 sec)

mysql> select * from wp_user_sub;
+—-+——-+———————————-+——–+———————+
| id | id_no | pd_src | enable | created_at |
+—-+——-+———————————-+——–+———————+
| 1 | 00001 | 6eddb71104751725f6d6894d4ddb030a | 1 | 2013-07-13 22:59:05 |
+—-+——-+———————————-+——–+———————+
1 row in set (0.00 sec)

mysql>

はい、自動的にデータベースのテーブルが作成されました。ついでにデータも1件入りましたね。
んー、便利。

Python WEBアプリをCGIで使う(後編:Part2)

今回は、Twitterのショートプログラムを作って見よう。

PythonでTwitterプログラムを作る時に便利なのがTweepy。
Twitter はREST API v1.0の頃と今は違って仕様が変わっています。巷にあふれているサンプルコードは動作しないものばかりです。動作するものはREST API v1.1に対応したtweepyが必要。
ところが、これがまた不完全で使えない機能が結構ある。

本家のtweepyが糞で使えない。一部対応しているが特に検索機能はだめ!
フォークしたtweepyを”sakito”さんが作ってるのでそれをインストールします。
https://bitbucket.org/sakito/tweepy/src/4e1704b3e391?at=default

Twitter検索の仕様)
https://dev.twitter.com/docs/api/1.1/get/search/tweets

Twitter application keyの取得)
ログインしてアプリケーション登録するとキーが取得出来ます。
https://dev.twitter.com/

hgを使ってローカルに取り込みます。まずはhgがないと話にならない。
# yum install python-devel
# easy_install -U mercurial
# hg clone https://bitbucket.org/sakito/tweepy
# cd tweepy
# python setup.py install

はい、これで使えるようなりました。

検索プログラムで特定のTweetを引っ張りましょう。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import os.path
import tweepy2
import urllib

CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

# Twitter の認証を行う
auth = tweepy2.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy2.API(auth)

def main():
# 検索
    query = u"犬" # クエリ
    results = api.search_tweets(urllib.quote_plus(query.encode('utf-8')))

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

    for result in results:
         print str(result.created_at) + "<br>"
         print result.user["name"].encode('utf-8') + "<br>"
         print result.text.encode('utf-8') + "<br>"
         print "-----------------------------------------------------------------------------------------<br>"
    print "</body>"
    print "</html>"
    print ""

if __name__  ==  '__main__':
    main()

Python WEBアプリをCGIで使う(前編)

「Python WEBアプリをCGIで使う」は一番手軽な作り方。既に作られているプログラムの継接ぎやちょっとした機能を作るならこれで十分。
確かに簡単ですから。WEBサーバへの設定が少なくて済む。

ApacheのWEBサーバ設定は基本気をつけるのは2箇所くらい。
CGIスクリプトのパス設定とExecCGIを追加すること。WEBサーバは言語に関係なくコンテンツプログラムを拡張子.cgiにしておけば
デフォルト設定でハンドラーのあたりはOKだ。 下記に仮想ホストのサンプルを貼り付ける。

<Virtualhost *:80>

ServerName  test.example.com
ServerAdmin test@example.com
CustomLog logs/test.access_log common
ErrorLog logs/test.error_log

DocumentRoot /home/www/html/httpdocs

ScriptAlias /cgi-bin/ /home/www/html/cgi-bin/
    <Directory "/home/www/html/cgi-bin">
        AddHandler cgi-script .py .cgi
        AllowOverride None
        Options ExecCGI SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>
   <Directory "/home/www/html/httpdocs">
        AllowOverride All
        Options ExecCGI SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all

   </Directory>
</virtualHost>

Pythonの仮想環境を作る

Pythonをやり始めると、まず最初に覚えたほうがよいなーと思うことは開発環境つくりです。

開発環境を作るという行為は、簡単に言ってしまうとLINUXのOSを入れて必要なソフトウェア・パッケージを入れる作業です。
沢山のお客様を抱えていると、単純に1台のコンピュータでは複数の」お客さまの事情にあった構成にできないケースがあります。
今なら、VSPサービスのような仮想マシンを立てるのが主流となっていますが、WEB系の世界に目を向けるとそこまでやらなくても
よいかなーと思います。

PHPにしろPythonにしろ、言語システムなるものを最初に導入しますが、オプションで導入するライブラリーパッケージが沢山
あり開発環境に合わせて取捨選択が必要となります。

Pythonを使い出してわかったことは、Pythonは有効バージョンがいくつか存在しており、微妙に仕様がちがうためこの点が
意外と問題になりやすい。PHPでもまあ、こんなことよくありますが。

で、Pythonはこの問題をクリアするのが簡単なです。
ようは、バージョンやパッケージに依存しない閉じた世界の開発環境を手軽に作るシステムが存在します。
それがvirtualenvという仕組みです。

virtualenvはpipコマンドからインストールします。
$pip install virtualenv

virtualenvを使って仮想環境を構築)

3パターン方法を案内します。

※ DEST_DIRは実際の自分の使っているパスに置き換えてください。
$ virtualenv DEST_DIR $ python virtualenv.py DEST_DIR <—-仕様付きで構築
$ virtualenv –no-site-packages DEST_DIR <—-余計なパッケージがはいらないまっさらで構築

仮想環境をイネーブルします。作業を開始する前にこの作業を実施しないとパスとか変数が通りません。
$ cd DEST_DIR
$ source bin/activate