PythonでS3にファイルを保存する

2014-09-30
このエントリーをはてなブックマークに追加

ユーザーがアップロードした画像とかをS3に保存したいときに使うメモ。

AWSのAccessKeyとSecretAccessKeyはAWSコンソールにログインして、「右上のアカウント名 > Security Credentials」 で生成しておきます。

pip install boto

S3に投げ込むのはboto(読みはボートー、でいいんだろうか。。。)だけあればOK。Python2.7でもPython3.4でもpipでインストールできました。

$ pip freeze
boto==2.32.1

投げ込むコードは以下

from boto.s3.connection import S3Connection
from boto.s3.key import Key


def main():
    print('start')
    _s3 = S3Connection(
        'AccessKey',
        'SecretAccessKey',
    )
    _bucket = _s3.get_bucket('バケット名称')
    _key = Key(_bucket)
    _key.set_metadata('Content-Type', 'image/jpeg')
    _key.key = 'img.jpg'
    _key.set_contents_from_filename('./img.jpg')

if __name__=='__main__':
        main()

非常に簡単。

set_metadataは無くてもJpegファイルの場合は問題ないっぽいけど、Content-Typeによっては問題が出たりするのかもしれない。

バケット側のパーミッションとかポリシーとかはまた別の話ということで。

PythonでYAMLを読んでみた

2014-09-19
このエントリーをはてなブックマークに追加

今更感満載なんですけど、最近何度か続いてyaml触ったもんでメモとして。

使うのはPyYAMLです。

pip install pyyaml

Python2でもPython3でも上記で入るはずです。2.7と3.4で試しました。

host: HOSTNAME
port: PORT
dbname: DBNAME
user: USERNAME
passwd: PASSWD

こんなYAMLをDBの接続情報として用意しておいたとして、

import yaml

def main():
    _var = open('./settings.yaml').read()
    _yaml = yaml.load(_var)

    print(_yaml['host'])


if __name__ == "__main__":
    main()

読んだYAMLは辞書になってますので、_yaml[キー]で触れます。
ちょっとした設定ファイルとかには便利ですね。

Python3.4でMySQLに接続してDjangoでも使ってみる

2014-09-18
このエントリーをはてなブックマークに追加

MySQLドライバはどれを使えばいいのかはっきりわからない、というのがPython3に本格的に踏み込めないでいた一番の理由がだったわけですが、MySQL Connector/PythonがPython3をサポートしててDjangoでも使えてマルチバイト文字もちゃんと通るっぽかったので試してみました。

unzip mysql-connector-python-1.2.3.zip
cd mysql-connector-python-1.2.3
python setup.py install
pip freeze

インストールはこれだけ。
DB-API 2.0準拠らしいので触り方も変わらずに安心。こういうのがPythonのいいところじゃないかと。

import mysql.connector


def main():

    _conn = mysql.connector.connect(
            user='USERNAME',
            password='PASSWD',
            host='127.0.0.1',
            database='DBNAME')

    _cur = _conn.cursor()
    _cur.execute("select * from app_comment;")
    for _row in _cur.fetchall():
        print(_row[0])

    _cur.close()
    _conn.close()

if __name__ == '__main__':
    main()

DjangoからMySQLを使うときはこれで。

DATABASES = {
    'default': {
        'NAME': 'DBNAME',
        'ENGINE': 'mysql.connector.django',
        'USER': 'USERNAME',
        'PASSWORD': 'PASSWD',
    }
}

マルチバイト文字使ってもinsert,update、selectひと通り問題なさ気だったので試しになんか書いてみようと思いました。

あ、Djangoは1.7で試してます。

CentOSにPython3.4をインストールして仮想環境を作るところまでやってみた

2014-09-17
このエントリーをはてなブックマークに追加

「Python3やんなきゃね」が季節の挨拶じみてきたので久々に重い腰をあげてみました。もう3.4かいな。
Djangoも1.7とか。

sudo wget https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tgz
sudo tar zxfv Python-3.4.1.tgz
cd Python-3.4.1
sudo ./configure --enable-shared
sudo make & make install

sudo vi /etc/ld.so.conf
/usr/local/lib
ldconfig

ここまででPython3.4が起動するようになりました。
試しに

# /usr/local/bin/python3.4

Python 3.4.1 (default, Sep 16 2014, 12:43:31)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

おぉ、できたできた。
ついでに仮想環境も。
mkvirtualenvじゃなくてPython3っぽくvenvを使ってみます。

/usr/local/bin/python3.4 -m venv demo34
source demo34/bin/activate
pip freeze
deactivate

easy_installとの決別です。
気になるのはMySQLのドライバかなー。