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で試してます。
python manage.py –settings=project_name.dev_settings
まあこれだけの話なんですけど、知らないと意外と不便なので。
project_nameがDjangoの各自のプロジェクトの名前でmanage.pyと同一階層にプロジェクト名のフォルダがありまして、その中にdev_settings.pyという開発環境用の設定ファイルがある、という体でのお話でした。
project_name/
├── manage.py
├── project_name
│ ├── __init__.py
│ ├── dev_settings.py
│ ├── settings.py
│ ├── wsgi.py
こんな感じですね。
使い分けるのはこれしか方法がないわけじゃないんですけど、ハセテツはこんなやり方してますよ、というメモでした。
前は –settings=dev_settings だけでよかった気がしたんだけど、気のせいかな。Django1.6でのお話でした。
Djangoでバッチファイルの実行をする方法です。
だいぶ前に「PythonでDjangoを使ったバッチ処理」で説明していますが、別のやり方です。というか、Djangoとしてはこっちが正しいんだと思います。
まずは任意のプロジェクトがあって、プロジェクトにappというアプリケーションが作成されているものとして進めます。
そこで、app(アプリケーションフォルダ)の下に「management」というフォルダを作成、中に__init__.pyを配置します。__init__.pyは空でいいです。
次に、managementフォルダの中に「commands」というフォルダを作成、またもやcommandsフォルダのなかに__init__.pyを配置します。もちろん、空で大丈夫です。
そして、commandsフォルダの中に「mycommand.py」を配置します。これが今回のメインになります。ここまでで以下の構成になっていると思います。
プロジェクトルート/
| app/
| | management/
| | | commands/
| | | | __init__.py
| | | | mycommand.py
| | | __init__.py
| | __init__.py
| | models.py
| | tests.py
| | views.py
| __init__.py
| manage.py
| settings.py
| urls.py
これでやっとバッチ処理が書けます。mycommand.pyを開いて、
#! /usr/local/bin/python
# -*- coding: utf-8 -*-
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, *args, **options):
print "hello command."
これでOK!
python manage.py mycommand
で実行できます。もちろんDjangoのmodelとかも触れます。*argsがあるから引数もOK!
こっちのほうがきれいにまとまりますね。
Python2.7、Django1.3.1で動作しています。試してませんが、もっと古いDjangoでも動くのではないかと。
以前はxml出力してクライアントでパースしたり、htmlを出力してそのまま埋め込む、っていうやり方が多かったのですが、最近はjsonを多用しています。
from django.utils import simplejson
from django.core import serializers
def index(request):
_values = simplejson.dumps([{“key0”: “value0”, “key1″:”value1″}], ensure_ascii=False)
return HttpResponse(_values, mimetype=”application/json;charset=utf-8”)
出力するのはこれだけ。非常に簡単。
Django1.3、Python2.7です。Djangoは1.1でも動いた記憶が。Pythonは2.6以降かな。まぁ2.6以降っていってもjsonの取り扱いだけですけど。あ、Python3は知りません。
jQuery側は
$.getJSON(url, function(result, status){
alert(result[0].key0);
alert(result[0].key1);
});
これだけ。jQueryは1.6使ってます。
同じフォームを複数の画面で使う場合、使う画面によって指定するcssのclassが異なるケースがあると思います。
そんな時、view側でフォームのインスタンスを生成した後でattrsを指定できると便利です。そんなサンプルです。
class EntryForm(forms.Form):
body = forms.CharField(widget=forms.Textarea())
こんなフォームがあったとして、viewで使うときには
_form = EntryForm()
_form.fields[‘body’].widget.attrs[‘class’] = ‘some_css_class’
です。これで
<textarea id=”id_body” rows=”10″ cols=”40″ name=”body” class=”some_css_class”></textarea>
こんな感じのHTMLが出力されます。
_form.fields[‘body’].widget.attrs[‘disabled’] = True
とかもできるので、シチュエーションによって使い分けられると思います。
Django1.3で試しましたが、1.0以降なら動くんじゃないかな?
ORM使っててなんか結果がいまいちなときは、どんなSQLが実行されたのか確認したくなるのが人情ってもんだと。
で、その方法です。
from django.db import connection
print connection.queries
これだけです。Django1.3でしか試してませんが、きっともっと古いのでも動くと思います。
GoogleAppEngine(GAE)はPythonが使えるのでぜひ利用させていただくべしなのですが、ずっとDjangoありきで書いてきちゃったもんで、GAEでもDjango使いたいんです。しかも、1.2。
まぁ別にwebapp使えばいいだけの話なんですけど、やはり使い慣れたDjangoが一番ですよね。まぁDjangoじゃヘビーすぎるからもっと軽快にwebappやFlaskでいいじゃんっていうのもありますが。
Pythonは2.5、Djangoは1.2.5を使います。simplejsonも事前にインストールしておきましょう。AppEngineSDKのインストールとかはGoogleさんが詳しく説明してくれています。今回使ったSDKのバージョンは1.5.2。古いとDjango1.2は動かなかったりするようです。
Djangoでプロジェクトを作るときは「django-admin.py startproject hogehoge」ですが、今回は別の手法を取ります。「Google App Engine Helper for Django」という便利なものを使わせて頂きます。事前にダウンロードしておいてください。
- 例えば「guestbook」というアプリを作りたいという前提で進めます。任意の場所のguestbookというフォルダを作ります。中は空でいいです。
- そして、ダウンロードしてきたGoogle App Engine Helper for Djangoを解凍し、生成されたフォルダの中身をguestbookフォルダの中にコピーします。guestbookフォルダの直下にappengine_djangoフォルダがあればOK。
- app.yamlをテキストエディタで開き、一行目の「application: google-app-engine-django」を「application: guestbook」に書き換え、manage.pyとmain.pyの「InstallAppengineHelperForDjango()」を「InstallAppengineHelperForDjango(‘1.2’)」に書き換えます。まぁアプリケーション名と使用するDjangoのバージョンを書くだけですね。
- GoogleAppEngineLauncherを起動し、アプリケーションを登録します。新規じゃなくて、既存のアプリケーションを登録してください。ここではguestbookフォルダを選択するだけです。
- GoogleAppEngineLauncherでguestbookを選択、「Run」をクリック。左のアイコンが緑の矢印になったら起動成功です。「Browse」をクリックしてDjangoのいつもの「It workd!」が出たら成功!
長くなったので今回はここまで。アプリケーションの追加とかは後日続き書きます。というか、そっから先は普通のDjangoなので不要かな。
ORの数が決まっているならどうって事ないのですが、例えば複数キーワードを入力できるコンテンツ検索機能などを実装しようとすると意外と難しかったりします。
from django.db.models import Q
def search(request):
_words = (u’キーワードその位置1’, u’キーワードその位置2’)
queries = [Q(title__contains=word) for word in _words]
query = queries.pop()
for item in queries:
query |= item
_list = Entry.objects.filter(query)
キーワードのリストは検索フォームからPOSTされたものとしてください。個数は可変です。Entryというモデルに含まれるtitleというフィールドからの検索です。検索ワードが含まれるデータを検索しています。
で、ORでクエリをつないでいって、最後に検索しています。
Django1.2.3で実装、動作していますが、Qオブジェクトが使えるバージョンならどれでも動くと思います。
_response = HttpResponseRedirect(リダイレクト先)
_response.delete_cookie(クッキーの名前)
return _response
これだけ。
Djangoのフォームは非常に便利で、コード量を猛烈に削減してくれます。が、多機能であるが故に使いこなせないと宝の持ち腐れになります。
はい、持ち腐れてます。泣。
ユーザにフォームでの入力をしてもらう場合、いくつかの選択肢から複数選択してもらうケースがあります。今回はそのサンプル。
フォームを定義するときに、
week = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=[(0,u’月’),(1,u’火’),(2,u’水’),(3,u’木’),(4,u’金’),(5,u’土’),(6,u’日’),])
これだけ。これで月~日の複数選択可能なチェックボックスが出力されます。ユーザからの入力値はリストで返ってきます。
また、初期値を入れたい場合は[1,3]とリストで渡してあげればOK。上記の例だと火曜日と木曜日にチェックが入った状態で出力されます。
結構悩みました。
Python2.5、Django1.2.3で動作。1.0から動くみたいです。