Latest entries

django-pistonでRestfulなWebAPIを簡単につくる

先日Twitterでつぶやいてたdjango-pistonですが、グーグル先生に聞いても日本語の記事はほとんど見つからなかったんで、わたくしが書いてみようと思います。

django-piston はもともとBitbucketのWebAPIのために作られた(多分)もので既存のDjangoのモデルを利用して簡単にRestfulなWebAPIが作れるという代物です。個人的には、いつか使ってみようと思いながら機会がなかったんですが、最近iPhoneアプリ作ってて、サーバ側の実装に使えそうだと思ったので使ってみました。

主な機能としては、

  • RestfulなWebAPIっぽく、GET POST PUT DELETE を受けれる
  • 1時間に50回までとかAPI呼出回数の制限をデコレータでつけられる
  • ベーシック認証とOAuth認証に対応
  • ドキュメント生成
  • Djangoのformを利用したバリデーション

今回は、だいぶ前に @soundkitchen 氏に作ってもらったこのブログを使って実験してみます。ちなみにこのブログのソースは bitbucket にて公開しはじめました。場当たりでDjangoのバージョンアップにだけ対応してきたのでちょっと古いコードとかもありそうだし、いろいろいじりたいと思ってます。

今回の動作サンプルはこちら

そしたらこのブログのエントリーを取得できるようなAPIを書いてみます。現在のエントリー部分のモデルは、↓のような感じです。とりあえずこの中からいくつかのフィールドを持ってくるようにしてみます。

class Entry(models.Model):
    """
    blog's entry.
    """
    title = models.CharField(_(u'title'), max_length=255, default=None)
    slug = models.SlugField(_(u'slug'))
    description = models.TextField(_(u'description'))
    comments_count = models.IntegerField(_(u'comments count'), editable=False, default=0)
    trackbacks_count = models.IntegerField(_(u'trackbacks count'), editable=False, default=0)
    created_at = models.DateTimeField(_(u'created at'), editable=False, default=datetime.now)
    updated_at = models.DateTimeField(_(u'updated at'), editable=False)
    published_at = models.DateTimeField(_(u'published at'), editable=False, blank=True, null=True)
    is_published = models.BooleanField(_(u'is published'), default=True)
    is_active = models.BooleanField(_(u'is active'), default=True)
    tags = models.ManyToManyField(Tag)

とりあえず、django-pistonのインストール。最新版は0.22なんですが、これだとDjango1.2以降でPOSTするときにCSRF用のトークンがないって言われて動かないのでtip版の0.23rc1を使ってます。

まずは、プロジェクトのルートにapiというディレクトリとurls.py、handlers.py をそれぞれ作成します。

$ mkdir api
$ touch api/__init__.py
$ touch api/urls.py
$ touch api/handlers.py

次に、プロジェクトルートのurls.pyに手を加えます。

(r'^api/', include('api.urls')),

これを追記して、/api/以下へのアクセスは、api/urls.pyに丸投げしましょう。そして、api/urls.pyの中身は↓のような感じ。

from django.conf.urls.defaults import *
from piston.resource import Resource

from api.handlers import EntryHandler

entry_resource = Resource(EntryHandler)

urlpatterns = patterns('',
    (r'^posts/$', entry_resource),
    (r'^post/(?P<entry_id>\d+)/$', entry_resource),
)

EntryHandlerはこれからapi/handlers.pyに書くやつです。ここでは、/api/posts/ に来たときと /api/post/1/ とかに来たリクエストをさばく設定をしました。そして、api/handlers.py は↓な感じ

#vim:fileencoding=utf8
from piston.handler import BaseHandler

from blog.models import *


class EntryHandler(BaseHandler):
    """
    ブログのエントリーを返す
    """
    allowed_methods = ('GET',) # GETだけ受けつける
    fields = ('title', 'description', 'created_at', 'updated_at', 'get_absolute_url', 'tags') # 取得したいフィールド
    exclude = () # 除外するフィールド(これを空にしておかないとデフォルトでは、idが省かれる)
    model = Entry # モデル

    def read(self, request, entry_id=None):
        """
        entry_idがある場合は単一のエントリー。
        なければ最新の10個。
        """
        if entry_id:
            try:
                instance = Entry.objects.get(pk=int(entry_id))
            except Entry.DoesNotExist:
                return rc.NOT_FOUND # 404 を返すショートカット
        else:
            return Entry.objects.all()[:10] # 10個もってくる
        return instance

とりあえずこんな感じで動きます。GETのリクエストを受けるのがreadメソッドとかPOSTを受けるのが、createメソッドとかっていう決まりがあるんですが、今回はとりあえずGETだけ受けつけるようになってます。ちなみに、デフォルトではJSONでレスポンスが返るんですが、/api/posts/?format=xml とかするとXMLで返してくれます。

今回は疲れたのでここまでで、次はPOSTとかPUTとかDELETEも受け付けてみようと思います。

Posted at: 
2010/10/31 16:31:07
0 Comments
1 TrackBack
Tags: 
Django
Trackback: 
http://blog.monospace.jp/2010/10/31/django_piston_intro/trackback/

ブログ復活しようと思いました

かれこれ1年半ぶりくらいでしょうか。おそらく名古屋から関東に来てからは一度も書いてないような気がします。

まあそんなことはどうでもいいんですが、最近はWebデザイナーという肩書だったことの面影もなく、WebアプリとかiPhoneアプリの開発がメインのお仕事になっています。そろそろ、仕事に追われすぎて世の中から置いていかれるのはよろしくないということで、再度ブログを書くあたりから復活しようという次第です。今後は、引き続きDjango関係とiOSアプリとかその他どうでもいいことについても書いていこうかと思っております。またよろしくお願い致します。

どうやらDjangoのバージョンあげたらブログがおかしくなったので、なんとかするのが最初のタスクのようです。

Posted at: 
2010/10/30 23:19:19
0 Comments
0 TrackBacks
Tags: 
information
Trackback: 
http://blog.monospace.jp/2010/10/30/blog_reloaded/trackback/

iTermに乗り変えたついでにScreenも入れなおして256色対応にした

iTerm は特に使う理由がないと思ってたのでスルーしてたんですが、ふと思い立って入れてみました。別に重かったりもしないし割といいなーと思ってたら、Terminal で決定的に問題だった、set ambwidth=double が効かない問題がなんと iTerm では解決できていたのでさっさと乗り換えることにしました。

set ambwidth=double が効かない問題っていうのは、Terminal から Vim を使ってると set ambwidth=double にしても、□とか◯とかって文字がマルチバイト扱いしてもらえなくて、結果的にその後の文字とカーソルがずれるっていう問題です。これは HTML なんかを書いてると致命的で、仕方なくそのために gVim を起動してたりしてたわけです。

ついでに前々から gVim ではなくて Vim でも、シンタックスカラーリングをカラフルにしたいなあと思いつつ我慢してたわけですが、なにげに こんなエントリー を見つけたので早速導入してみました。

これで、256色対応って書いてあるカラースキームなら使えるようになります。本家 vim.org でも検索するとそれなりに見つかります。 拙作の monochrome.vim も対応しようかな。(見にくいとかマジレスされても困りますからね)

[追記: 09/03/17 01:49] iTerm + screen + vim での色設定

256色に変換するプラグインがあったんですなー!

Posted at: 
2009/03/17 00:50:43
1 Comment
0 TrackBacks
Tags: 
iterm
vim
Trackback: 
http://blog.monospace.jp/2009/03/17/iterm_screen_256/trackback/

CappuccinoのloggingをFirebugに

Cappuccino をぼちぼち攻めて行くわけですが、とりあえずデバッグ的なところから。

Cappuccino はクライアントサイドのフレームワークなので基本的に開発環境は、エディタとブラウザです。で、今や HTML や CSS を書くにしても Javascript を書くにしても必須なのが Firebug です。そこで、 Cappuccino でも使いたいのですが、その方法についてメモしておきます。

Cappuccino には CPLog という logging の機能があって、 よくある fatal error warn info trace 的なものを出力することができます。まずは

CPLogRegister(CPLogConsole);  // LogProvider を CPLogConsole に設定
CPLog.trace([label stringValue]); // trace 出力
CPLog.fatal([label stringValue]); // fatal 出力

とりあえず一通り出力して見ると、Firebug に以下のように表示されます。

FirebugにCPLogを出力

こんな感じに表示されるので、困ったときはとりあえず表示してみるってことで一安心ですね。なんとか開発を進めていけそうです。

参考にしたのは、本家の こちらの Wiki です。他にもポップアップウィンドウで出す方法とか独自の LogProvider を作成するって方法もあるみたいです。

Posted at: 
2009/03/07 00:58:08
0 Comments
0 TrackBacks
Tags: 
cappuccino
Trackback: 
http://blog.monospace.jp/2009/03/07/cappuccino_firebug/trackback/

Atlasの発表で分かるCappuccinoの本気

先日マイアミの方で、 Future Of Web Apps というイベントがあったようです。そこで、 Cappuccino(Objective-J) の開発者から新しいサービスの発表がありました。

発表内容は以下の記事参照。スクリーンキャストあり。

Atlas というサービスで、夏頃のリリース予定なのだそうですが、次世代の Web UI 開発を感じさせてくれました。簡単に言ってしまうと、 Apple のソフトウェア開発環境である XCode を Cappuccino を使って、Web 上で実現したものと言えると思うのですが、いわゆるオンラインで Web UI を開発できる既存のサービスと Atlas とは決定的に目指すところが違います。それは、Cappuccino というフレームワークが XHTML だとか CSS だとか Javascript だとかそういうものの1段階上の層での Web UI の開発を実現している点です。

現状の Web UI の制作だと、HTML のコーディングのことを考えてデザインをしないといけないとかよくありますよね。ここにドロップシャドウつけたら、おそろしくめんどくさくなるとか。それテーブルレイアウトでおkって時代もあったけど、今 XHTML でのマークアップとかセマンティック Web とかって言われてます。でもそれって Web UI の未来にとってうれしいことなのか正直疑問です。ものすごくきれいに HTML や CSS が書ける人がいても得するのはせいぜい一緒に仕事する人くらいでしょう。なんかそういう部分から離れて、使う側から考えた Web UI を作れる方が楽しくなると思うんですよね。まあ、XHTML Valid のバナーが誰にとって得かって話です。

いつになってもなくならない IE6 問題とか、いつ普及するのか、もしくはほんとに完成するのかもよく分からない HTML5 とか CSS3 の実装状況がどうとか、もはやそういうのは低レイヤーになってしまったんです。なってしまってほしいです。Atlas がその理想形とは言いませんが、現状を見ると、楽しい Web UI の開発の未来はこういうところにあるのではないかなあ。

とたまには語ってみるのでした。まあ、Cappuccino には Objective-Jを覚えないといけないという最大の壁がありますからねw でも、XHTML+CSS+Javascript = Objective-J なわけで、これから学ぶなら一つだけ分かればオッケーっていう方がいいですよね。今後こういうコンセプトのものが増えてきたら面白いなあと思いました。

Posted at: 
2009/03/01 18:58:22
0 Comments
0 TrackBacks
Tags: 
cappuccino
Trackback: 
http://blog.monospace.jp/2009/03/01/cappuccino_atlas/trackback/

Python東海 第5回のまとめと発表資料公開します

[追記:2009/02/23 15:23] 今回も 株式会社 Vish 様のセミナールームをお借りしました。ほんといつもお世話になってます。

PythonとOpenIDのお話 by aodag

OpenIDの仕組みとPythonで扱う場合の解説。

  • OpenIDは認証のときにたくさんリダイレクトする。
  • OPは、IDをOpenIDとして提供する側、RPは、OpenIDでの認証に対応したサービス側。
  • これからは、OpenID 2.0を使っていこう。
  • openid.ne.jp は、1.1にしか対応してないからだめじゃん(自分もここの使ってた)。 myopenid 使おうよ。
  • URLでの認証の他、XRIというURL風の文字列で認証できる
  • XRIの@とか=の部分の文字列をi-nameという。有料で取得できる。企業用と個人用がある。
  • OPが持っている個人の情報をSREGという形式でOP RP間で受け渡しができる。
  • SREGはあくまでも登録を容易にするためのものなので、受けとったSREG情報をサービス側で保持する必要あり。
  • OpenID Enabled というサイトに、Python用のライブラリがある。
  • Yadis という仕組みがある。(よくわかってないので要調査)

集合知プログラミング本のコードを書いてみる by issm

オライリーの集合知プログラミング本の解説。数学とか統計とか超苦手だー。おもしろそうではあるんだけど。ちなみにこの本は買ったけど、まだ20ページくらいしか読んでない。

  • ユークリッド距離で人の趣味嗜好の似ている具合を求める。
  • ピアソン相関ってなんだ? なんか数式がでてきたー!
  • でもこの本はあんまり数式を意識しなくてもいいように書かれてるよ。

この本ちゃんと読んでみようと思った。これは単体の読書会が必要かも。

IPythonをマスターしよう by わたくし

自分の発表資料は、以下のとおりです。 SlideShare を使ってみたかった。

開発サーバ(TracLightning)でTracプラグイン開発 by akihirox

30分でVirtualPC上に TracLightning をインストールしてプラグイン開発環境を作るお話。実際に30分程度で開発環境ができていた。

  • TracLightningというWindows用のexeファイルがある。
  • TracLightningにはいろいろなソフトが同梱されている。Apache Subversion Python Trac Maven Hudsonなどなど
  • Hudson は、継続的インテグレーションツールというもので、Java上で動く。JREが必要になる。
  • BuildbotもHudsonと同じようなものだが、WebインターフェースはHudsonがかなり優秀。
  • Hudsonは、検索しにくいという名前の問題がある。日本人の方が作っている。

まとめ

今回は、参加者6名中4名が発表というなかなかアグレッシブな内容でした。ただ、参加者が減って来てる傾向があるので、東海地区のみなさま(もちろん遠方からでも歓迎です)、お気軽にご参加ください。Pythonに関する発表ならなんでもかまいませんので、発表者の方も募集中です。敷居はとても低いです。Pythonに興味があるけど、使ったことないって方でも是非是非ご参加ください。

Posted at: 
2009/02/22 14:28:07
0 Comments
1 TrackBack
Tags: 
ipython
python
python-tokai
Trackback: 
http://blog.monospace.jp/2009/02/22/python_tokai_5/trackback/

Cappuccinoのビルドとインストール

なんか Cappuccino ばっかやってた1日なので無駄にしないようにメモ。ビルドとインストールとかいうと、なんでそんなものが必要なのかと思うわけですが、あると便利とかそういう話なのでしなくても動かせます。

とりあえず動かす場合

Cappuccino のサイトの Download のとこから StarterPackage を落として解凍すると、 Starter というディレクトリが出来あがります。この中に、NewApplication というディレクトリがあって、この中の index.html をブラウザで開くと、 Hello World が完了です。つまりこの、NewApplication 内のものだけあれば、Cappuccino は動くわけです。

管理コマンドとか使いたい場合

最近のフレームワークってプロジェクトのスケルトン作成コマンドとかついてますよね。そういうのを使いたい場合は、 Download のとこから Frameworks & Tools ってやつをダウンロードして解凍します。 Tools ってディレクトリが出来あがるので、その中に移動して、 install-tools ってコマンドを実行します。そうすると /usr/local/bin あたりにコマンドがインストールされます。インストールされるコマンドについては、 この辺 で。次に、シェルの環境変数に2つ程登録した方がいいよと言われるのでそれを追加。

  • export OBJJ_HOME=/usr/local/share/objj
  • export STEAM_BUILD=~/objj_build

とりあえず、これで steam コマンドが使えます。

$ steam create hello

そうすると hello というプロジェクトが出来てます。 Django で言うところの、 django-admin.py startproject ですね。

あんまり詳しくないけど、 Rhino とかその辺が使われてます。他のコマンドは、どうやって使うのかまだよくわからないインタラクティブシェルとかコンパイラ的なものが含まれてます。ユニットテストツールもあるっぽいです。

フレームワークが割とでかいのでデプロイ時の最適化は必要なんだろうなーと思う感じであります。

Posted at: 
2009/02/16 02:15:00
0 Comments
0 TrackBacks
Tags: 
cappuccino
cocoa
Trackback: 
http://blog.monospace.jp/2009/02/16/build_and_install_cappuccino/trackback/

Cappuccino Web Framework についてそろそろ…

ちょっと前に話題になったけど、そろそろみんな忘れてるであろう Cappuccino Web Framework についてちょっと書いておこうかと。ちなみに自分も忘れてて久々に思い出しただけですが… とりあえず、Google 先生に聞いても、ほぼ発表当時の記事しかない状況だったので、復習しておきましょう。

Cappuccino Web Framework って?

  • Apple の Cocoa アプリの開発っぽく Web インターフェースを構築できる。
  • HTMLとかCSSとかJavascriptと「さよなら」して、Webアプリが書けるクライアントサイドのフレームワーク。
  • PrototypeやjQueryとは一線を画した Javascript ライブラリとも言える。
  • Objective-J という言語を使用する。(Javascriptだけど、見た目は完全に Objective-C な言語)
  • UI デザインも Cocoa 風になる。
  • 対応ブラウザは、IE6,7 FF2,3 Safari3/Webkit Chrome Opera9。
  • LGPL ライセンス。
  • ネタではない。

これって誰が得すんの?

  • Cocoa または、 iPhone アプリを作ってる人とか Cocoa API を知ってる人。
  • Web のクライアントサイド構築に、 HTML CSS Javascript とかとかいろいろ覚えたくない人。
  • IE爆発しろって思ってるオレ

欠点は?

  • Cocoa に全く縁がない人は、利点が見いだせない。
  • 結構重いかも。(体感のみで確証はない)
  • どうやら Valid じゃない HTML を吐くっぽい(追記:2009/02/15 21:22)

誰が使ってんの?

  • 未だに表立って使ってるって言ってるサイトは、 280 Slides くらい?

普段からクロスブラウザと戦ってるとこういうの応援したくなるんです。幸い多少の Cocoa の知識があるので、すんなり入れたし、可能性を感じます。Cocoa アプリの経験があると、チュートリアルやってるときににやけてくると思います。最近、 iPhone アプリの影響でこっちの方の開発してる人増えてると思うので、是非やってみてはいかがでしょうか。

自分も今、チュートリアルやり直してるとこです。 Django と Cappuccino で幸せな Web アプリ開発生活を夢見ています。

Posted at: 
2009/02/15 16:18:42
0 Comments
1 TrackBack
Tags: 
cappuccino
cocoa
Trackback: 
http://blog.monospace.jp/2009/02/15/cappuccino_web_framework/trackback/

Djangoでファイルアップロードのエラー

Python 旅館に来ています。過去にはまったことはメモっておくべきと思ったので、マメにブログに書いていこうと思いました。

とりあえず、 ImageField を含む適当なモデルを書いて、管理画面から追加したところ、画像のアップロードができません。というエラーの話。

環境は、MacOSX 10.5 Python2.5.1 Django1.0.2 です。

エラー内容は、「画像をアップロードしてください。アップロードしたファイルは画像でないか、または壊れています。」というもの。このエラーを django/conf/locale/ja/LC_MESSAGES/django.po から探すと、 django/forms/fields.py に書いてあるとのこと。なるほど、とりあえずPILが認識できない画像があがってくると、このエラーメッセージが出るっぽい。

要するに Python Image Library が JPEG を扱えなかったようですね。

$port install jpeg

Port で Jpeg 操作用のライブラリをインストールして、 PIL のインストールをし直して完了。その際に PIL の setup.py install でできた build ディレクトリとか消した方がいいですね。無事にアップロードできました。

Posted at: 
2009/01/31 02:12:04
0 Comments
0 TrackBacks
Tags: 
Django
Trackback: 
http://blog.monospace.jp/2009/01/31/django_file_upload_error/trackback/

Python東海 第4回

まずは、毎度のごとく会議室を使わせて頂いて差し入れまで頂いている 株式会社Vish 様と aodag 様に感謝致します。

今回は、8名参加ということでいつもよりちょっと少なめな感じなんですが、自分の発表以外は割と充実した内容でした。というのも自分は aodag 氏が来るまでの時間つぶしに Django の布教でもしようかとちょっとだけ紹介したんですが、Python2.6とPython2.5がわけわからんことになってて変なところでつまづいてしまったので、きっとマイナス効果だったことでしょう。言い訳としては、普段ローカル(Mac)でDjangoの開発をしていないということで。やっぱりいずれ Django 勉強会@名古屋はやりたいです。今んとこ自分的に無理ですけど。

発表内容

開発環境について、主にテストとか - aodag さん

Pythonでテスト書くなら、とりあえず doctest で、 unittest よりも nose の方がいいよ。 twill を使うとブラウザのシミュレーションテストができる。あと、 webtest とか。 aodag 氏は Ian Bicking の信者らしいです。

あと、これは今すぐ入れるべきな、 virtualenv 。PyPI にあげようと思うならこれを使ってちゃんとインストールテストしろとのこと。自分も入れておけばバージョン問題に悩まされなかったことでしょう。

最後は、 buildbot について。グラフィカルに開発状況が見られるっていうのはなんだかおもしろい。こういうものは CI ツールと言うらしい。他には Hudson とかが有名とのこと。(最近iPhoneアプリでがんばってますよね) buildbot はすばらしいんだけど、デフォルトのデザインが適当すぎるのでなんとかしろとのこと。ちょっと見てみます。

Silverlight と IronPython - terurou さん

Siverlight のアプリは、 IronPython で作れるよという話。Flash は大量のオブジェクトの描画が苦手らしく、その辺は Silverlight が圧倒的に速いらしいです。 こちらにスライド が。Silverlight の開発言語は他にも Javascript とか IronRuby とかの LL な言語が使えるみたいです。 ただ、 Javascript は、外部ファイルの読み込みが困難なためおすすめできないとのこと。

Hello, World をやってみるのコーナーで印象的だったのは、開発サーバがついてること。 localhost:2060 って変わったポートだなーと思った。今思えば普通にブラウザが立ちあがるだけじゃだめなのかな。コンパイルしなくても動くって話かな。あと、 sl ってコマンドはどう考えても、SLが走るコマンドでしょう。で、最終的にデプロイするファイルは、xap というファイルになるみたいです。よくあるところの、実は拡張子が違うだけの zip というやつみたいです。

Silverlight は、xaml という UI を定義するものとロジックが完全に分かれているので開発面で便利。あと Expression Blend というソフトを購入すると、グラフィカルに UI を書けるツールが使えるようです。開発環境は基本的に、Windowsだけど、Macでも mono を入れるとできるっぽいです。 moonlight ってのもあったなあ。

そんな感じで思い出せるのは、この辺です。今日のエントリーは外部リンクが多くて大変だった。

Posted at: 
2009/01/25 02:09:25
0 Comments
1 TrackBack
Tags: 
python
python-tokai
Trackback: 
http://blog.monospace.jp/2009/01/25/python_tokai_4/trackback/