2013年3月5日火曜日

5. MySQLを使ったPyramidプロジェクトをwsgiで運用

Djangoじゃないのをやってみようということで、Pyramidをさわってみる。
そのときの記録。
今回はMySQLを使ったPyramidプロジェクトをwsgiで運用動作させてみる。

  • 環境
  • MacOS 10.8.2
    Python 2.7.3 (MacPortsでインストールしたものを使用する)
    MySQL 5.5.28 (MacPortsでインストールしたものを使用する)
    py27-pip 1.2.1 (MacPortsでインストールしたものを使用する)
    Apache 2.2.7 (標準でインストールされているもの)
    (mod_wsgiはソースを落としてきてインストール)
    Eclipse 4.2.1
    Pydev 2.7.1

今までのまとめ。
MySQLをMacPortsでインストールし、そのMySQLを使うPyramidプロジェクトも作成した。http://localhost:6543で表示する開発環境ではちゃんとMySQLと接続されて動作している。
今回は、development.iniではなくproduction.iniを参照する、運用環境での動作を確認する。
1. インストールとmod_wsgiでの動作」と同じようにwsgi関係のファイルをapache.confとPyramidプロジェクトの場所に作成する。

まず、pyramid.wsgiは、~/env_mysql/へ。その内容はこれ。
from pyramid.paster import get_app, setup_logging
ini_path = '/Users/me/env_mysql/MyProject/production.ini'
setup_logging(ini_path)
application = get_app(ini_path, 'main')

modwsgi.confは、/etc/apache2/other/へ。
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
WSGIDaemonProcess pyramid user=me group=staff threads=4 \
   python-path=/Users/me/env_mysql/lib/python2.7/site-packages
WSGIScriptAlias /myproject /Users/me/env_mysql/pyramid.wsgi

<Directory /Users/me/env_mysql>
  WSGIProcessGroup pyramid
  Order allow,deny
  Allow from all
</Directory>

これらのファイルを置いた後は「$ sudo apachectl restart」でapacheを再起動させておく。
で、http://localhost/myprojectに表示される。
そのはずなのに、エラーが発生する。
/var/log/apache2/error_logを見ると、libmysqlclient.18.dylibが見つかっていないようだ。
このファイルは「/opt/local/lib/mysql55/mysql/libmysqlclient.18.dylib」にあるので、「/usr/lib/libmysqlclient.18.dylib」としてシンボリックリンクを作成する。
$ sudo ln -s /usr/lib/libmysqlclient.18.dylib /opt/local/lib/mysql55/mysql/libmysqlclient.18.dylib

これで、http://localhost/myprpjectを見に行くとPyramidのページが表示される。

次回は、レコードの一覧や追加削除などの基本的な動作をするアプリを作成する予定。

2013年3月2日土曜日

4. MySQLを使うPyramidのプロジェクトを作る

Djangoじゃないのをやってみようということで、Pyramidをさわってみる。
そのときの記録。
今回はMySQLを使うPyramidのプロジェクトを作ってみる。
  • 環境
  • MacOS 10.8.2
    Python 2.7.3 (MacPortsでインストールしたものを使用する)
    MySQL 5.5.28 (MacPortsでインストールしたものを使用する)
    py27-pip 1.2.1 (MacPortsでインストールしたものを使用する)
    Apache 2.2.7 (標準でインストールされているもの)
    (mod_wsgiはソースを落としてきてインストール)
    Eclipse 4.2.1
    Pydev 2.7.1

  • MySQLの準備
  • 前回 3. MySQLのインストール でインストールしたMySQLを使う。
    MySQLにこのプロジェクトで使うデータベース「pyramid_db」と、ユーザー「pyramid_user」を作成しておく。
    MySQLに入る。
    $ mysql -u root -p mysql

    データベースの作成。
    mysql> CREATE DATABASE pyramid_db CHARACTER SET utf8;

    そのデータベースのユーザーの作成。
    GRANT ALL ON pyramid_db.* TO pyramid_user@localhost IDENTIFIED by "password";
    

    ちゃんと作成できたか確認する。
    $ mysql -u pyramid_user -p pyramid_db
    mysql> create table book (id int(11), title varchar(64));
    mysql> show tables;
    +----------------------+
    | Tables_in_pyramid_db |
    +----------------------+
    | book                 |
    +----------------------+
    1 row in set (0.00 sec)
    mysql> drop table book;
    

  • 新しい環境の作成
  • virtualenvで環境「env_mysql」を作って、そこにPyramidをインストールする。
    $ virtualenv --no-site-packages env_mysql
    $ cd env_mysql
    $ bin/pip install pyramid
    

  • SQLAlchemy を使った Pyramid Project の作成
  • $ bin/pcreate -s alchemy MyProject
    
    $ cd MyProject
    $ ../bin/python setup.py develop
    $ ../bin/python setup.py test -q
    $ ../bin/pserve development.ini
    で、http://localhost:6543に表示される。
    でも、表示されるのはエラーメッセージ。
    Pyramid is having a problem using your SQL database.

    残念ながら、動かす前にデータベースの初期化が必要だというメッセージが表示される。
    $ ../bin/initialize_MyProject_db development.ini 

    これでもう一度pserve。
    $ ../bin/pserve development.ini
    で、http://localhost:6543に表示される。

    参考にしたのはここ。
    SQLAlchemy + URL Dispatch Wiki Tutorial

  • ソースの修正の前にEclipseプロジェクトを作成する
  • Eclipseのプロジェクトにしておいた方が、修正や動作確認が楽。
    Eclipseを立ち上げて、workspaceを先ほど作成した「env_mysql」ディレクトリにする。
    新規のworkspaceの場合は、Open Perspective で PyDevを追加する。
    環境設定 → PyDev → Interpreter Python で、「env_mysql/bin/python」を登録する。
    System PYTHONPATHに次のディレクトリも含める。これにチェックを入れておく。
    /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/
    やっとここで、Eclipseの新規プロジェクト作成。PyDevのPyDev Projectで、名前は先ほど作成したPyramidのプロジェクトと同じMyProjectとする。
    Eclipseの環境設定にある PyDev Interpreter - PythonのString Substitution Variablesに「run_pyramid」で、値が自分の環境にあるbin/pserveとなる項目を追加する。
    さらにRun Configurationで、次の項目を設定する。
    Main: Project -> MyProject
    Main: Main Module -> ${run_pyramid}
    Arguments: Program arguments -> development.ini
    これで、Eclipseから実行することができる。ステップ動作も可能となる。

  • プロジェクトを修正してMySQLと接続する
  • development.iniとproduction.iniにある次の行を修正する。
    <変更前>
    sqlalchemy.url = sqlite:///%(here)s/MyProject.sqlite
    <変更後>
    sqlalchemy.url = mysql://pyramid_user:password@localhost:3306/pyramid_db?charset=utf8&use_unicode=1
    sqlalchemy.pool_recycle = 3600

    setup.pyで「mysql-python」の追加。
    requires = [
        'pyramid',
        'SQLAlchemy',
        'transaction',
        'pyramid_tm',
        'pyramid_debugtoolbar',
        'zope.sqlalchemy',
        'waitress',
        'mysql-python',
        ]
    

    myproject/models.pyで、フィールド型のTextをStringに変更する。
    from sqlalchemy import (
        Column,
        Integer,
        String,
        )
    

    同じくmyproject/models.pyのモデルのフィールド定義(class MyModel(Base):)のところもTextをStringにする。長さを指定し、uniqueは削除する。
    <変更前>
        name = Column(Text, unique=True)
    
    <変更後>
        name = Column(String(200))
    

    testしておく。ここで、ライブラリが読み込まれる。
    $ ../bin/python setup.py test -q

    /tmp/mysql.sockではなく、/opt/localのsockを読みに行ってしまうので、シンボリックリンクを作成しておく。
    $ sudo ln -s /tmp/mysql.sock /opt/local/var/run/mysql55/mysqld.sock
    

    その後、initialize_My_project_dbを実行する。
    $ ../bin/initialize_MyProject_db development.ini
    

    mysql> show tables;
    +----------------------+
    | Tables_in_pyramid_db |
    +----------------------+
    | models               |
    +----------------------+
    1 row in set (0.00 sec)
    mysql> show fields from models;
    +-------+--------------+------+-----+---------+----------------+
    | Field | Type         | Null | Key | Default | Extra          |
    +-------+--------------+------+-----+---------+----------------+
    | id    | int(11)      | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(200) | YES  |     | NULL    |                |
    | value | int(11)      | YES  |     | NULL    |                |
    +-------+--------------+------+-----+---------+----------------+
    3 rows in set (0.00 sec)
    
    mysql> select id, name, value from models;
    +----+------+-------+
    | id | name | value |
    +----+------+-------+
    |  1 | one  |     1 |
    +----+------+-------+
    1 row in set (0.00 sec)
    
    mysql> 

    Eclipseから、あるいは次のコマンドで実行するとPyramidのページが表示される。
    $ ../bin/pserve development.ini
    

    ここを参考にした。
    チラ裏 nginxとpythonとpyramid MySQLの設定
次回は、wsgiでの動作確認。

P.S.
2014.01.24
久しぶりに、新しくプロジェクトを作成してみたところ・・・
initialize_xxxx_db を実行すると「ImportError: No module named MySQLdb」と言われた。
で、MySQLdb をインストールする。
$ bin/pip install MySQL-python

もうあるぞ「Requirement already satisfied (use --upgrade to upgrade): MySQL-python in ./pyramid_xxxx/MySQL_python-1.2.5-py2.7-macosx-10.9-x86_64.egg」、と言われてインストールできない。
プロジェクトのディレクトリをみると「MySQL_python-1.2.5-py2.7-macosx-10.9-x86_64.egg」というファイルがあるので、これを削除してリトライ pip install。
うまくインストールできた。

こちらもよろしく。
Pyramid 1.5 + jinja2-alchemy-starter で MySQL の authentication

3. MySQLのインストール

Djangoじゃないのをやってみようということで、Pyramidをさわってみる。
そのときの記録。
今回はMySQLをPyramidで使うためにインストールする。

  • 環境
  • MacOS 10.8.2
    Python 2.7.3 (MacPortsでインストールしたものを使用する)
    MySQL 5.5.28 (MacPortsでインストールしたものを使用する)
    py27-pip 1.2.1 (MacPortsでインストールしたものを使用する)
    Apache 2.2.7 (標準でインストールされているもの)
    (mod_wsgiはソースを落としてきてインストール)
    Eclipse 4.2.1
    Pydev 2.7.1

  • MacPortsでinstall mysql
  • MacPortsを使ってMySQL5.5をインストールする。
    $ sudo port install mysql55-server
    $ sudo -u _mysql /opt/local/lib/mysql55/bin/mysql_install_db
    $ sudo port load mysql55-server
    $ sudo port select mysql mysql55
    Selecting 'mysql55' for 'mysql' succeeded. 'mysql55' is now active.
    

    MySQLのrootユーザパスワードの設定。
    $ /opt/local/lib/mysql55/bin/mysqladmin -u root password 'new-password'

    MySQLに入って設定を続ける。
    $ mysql -u root -p mysql
    

    すべてのポートのrootユーザーのパスワードを設定する。
    mysql> update mysql.user set password=password('new-password') where user='root';

    名前が空白のユーザーを削除する。
    mysql> delete from mysql.user where user='';

    権限変更の更新。
    mysql> flush privileges;

    userを表示して確認。
    mysql> select Host, User, Password from user;

    今回は関係ないが、念のためにエンコード関係の状態を表示してみる場合はこれ。
    mysql> SHOW VARIABLES LIKE '%collation%';
    mysql> SHOW VARIABLES LIKE '%character_set%';

    MySQLから抜ける。
    mysql> exit

    MacPortsでインストールした場合my.cnfがデフォルトのままでは、ソケットが/tmpに造られないので、my.cnfを修正する。
    my.cnfは「/opt/local/etc/mysql55」にある。socketの設定を追加する。
    # Use default MacPorts settings
    !include /opt/local/etc/mysql55/macports-default.cnf
    
    [client]
    socket          = /tmp/mysql.sock
    [mysqld]
    socket          = /tmp/mysql.sock
    
次回は、PyramidでこのMySQLを使ってみる。

2. Eclipseを使う

Djangoじゃないのをやってみようということで、Pyramidをさわってみる。
そのときの記録。
今回はEclipseを使うときの設定について。

  • 環境
  • MacOS 10.8.2
    Python 2.7.3 (MacPortsでインストールしたものを使用する)
    MySQL 5.5.28 (MacPortsでインストールしたものを使用する)
    py27-pip 1.2.1 (MacPortsでインストールしたものを使用する)
    Apache 2.2.7 (標準でインストールされているもの)
    (mod_wsgiはソースを落としてきてインストール)
    Eclipse 4.2.1
    Pydev 2.7.1

Eclipseの環境設定にある PyDev Interpreter - PythonのString Substitution Variablesに「run_pyramid」で、値が自分の環境にあるbin/pserveを追加する。

Run ConfigurationsのMain Moduleの設定。先ほどの「${run_pyramid}」とする。

Run ConfigurationsのArgumentsに「development.ini」を設定する。

これでEclipse環境下での開発が可能となる。

2013年3月1日金曜日

1. インストールとmod_wsgiでの動作

Djangoじゃないのをやってみようということで、Pyramidをさわってみる。
そのときの記録。

  • 環境
  • MacOS 10.8.2
    Python 2.7.3 (MacPortsでインストールしたものを使用する)
    MySQL 5.5.28 (MacPortsでインストールしたものを使用する)
    py27-pip 1.2.1 (MacPortsでインストールしたものを使用する)
    Apache 2.2.7 (標準でインストールされているもの)
    (mod_wsgiはソースを落としてきてインストール)

  • Pyramidのインストール
  • virtualenvで環境を作って、そこにPyramidをインストールする。アプリごとに環境を作る?
    $ sudo pip install virtualenv
    $ sudo pip install virtualenvwrapper
    $ virtualenv --no-site-packages env_pyramid
    $ cd env_pyramid
    $ bin/pip install pyramid
    

  • Pyramid Project の作成
  • $ bin/pcreate -s starter MyProject
    
    $ cd MyProject
    $ ../bin/python setup.py develop
    $ ../bin/python setup.py test -q
    $ ../bin/pserve development.ini
    で、http://localhost:6543に表示される。
    参考にしたのはここ。
    Creating a Pyramid Project

  • 運用
  • pyramid.wsgiは、~/env_pyramid/へ。その内容はこれ。
    from pyramid.paster import get_app, setup_logging
    ini_path = '/Users/me/env_pyramid/MyProject/production.ini'
    setup_logging(ini_path)
    application = get_app(ini_path, 'main')
    

    modwsgi.confは、/etc/apache2/other/へ。
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    
    # env_pyramid
    WSGIDaemonProcess pyramid user=me group=staff threads=4 \
       python-path=/Users/me/env_pyramid/lib/python2.7/site-packages
    WSGIScriptAlias /myproject /Users/me/env_pyramid/pyramid.wsgi
    
    <Directory /Users/me/env_pyramid>
      WSGIProcessGroup pyramid
      Order allow,deny
      Allow from all
    </Directory>
    
    で、http://localhost/myprojectに表示される。
    参考にしたのはここ。
    Running a Pyramid Application under mod_wsgi
    modwsgi.confの内容については調べてください。
次回はMySQLの接続

P.S.
2014.01.24
複数のアプリを置く場合は、こうするようです。
mod_wsgi.conf にこんな感じで追加していきます。
# env_seconds
WSGIDaemonProcess pyramid_env_parts user=me group=staff threads=4 \
   python-path=/Users/me/env_second/lib/python2.7/site-packages
WSGIScriptAlias /second /Users/me/env_second/pyramid.wsgi
<Directory /Users/me/env_second>
  WSGIProcessGroup pyramid_env_second
  Order allow,deny
  Allow from all
</Directory>

WSGIDaemonProcess pyramid_env_parts の「pyramid_env_parts」と <Directory> の中にある WSGIProcessGroup pyramid_env_second の「pyramid_env_parts」を一致させます。
これを重複の無いようにして増やしていきます。


2014.01.23
こうすると、site-packages を引き継ぐことができます。
$ virtualenv --system-site-packages env_parts

ただし、pyramid がすでにインストールしてあると、「Requirement already satisfied」とか言われてしまうので、これ。
$ bin/pip install --upgrade pyramid

いろいろ問題が出そうなので、virtualenv --no-site-packages のほうが良さそう。