None
目次:
django-bpmobileはDjangoフレームワーク向けのモバイルサイト開発支援モジュールです。日本の携帯電話キャリアのうち、NTT DoCoMo、au、Softbankのデバイスに対応しています。Djangoの標準機能ではサポートされない以下の機能を提供します。
現在djanbo-bpmobileは、bitbucket.org上で開発、公開されています。
開発バージョンは以下より入手できます。
http://bitbucket.org/tokibito/django-bpmobile/
Mercurialを利用しているなら、以下のコマンドでもダウンロードできます:
hg clone http://bitbucket.org/tokibito/django-bpmobile/
easy_installやpipでもインストールすることができます。インストールの詳細については、インストールを参照して下さい。
django-bpmobileは以下のモジュールに依存しています。
easy_installやpipでインストールするには以下のコマンドを実行します。
easy_install django-bpmobile
または、
pip install django-bpmobile
開発バージョンは以下より入手できます。
http://bitbucket.org/tokibito/django-bpmobile/
Mercurialを利用しているなら、以下のコマンドでもダウンロードできます:
hg clone http://bitbucket.org/tokibito/django-bpmobile/
django-bpmobileはDjangoのアプリケーションであるため、bpmobileディレクトリをDjangoのプロジェクトディレクトリ以下に配置して利用することもできます。
django-bpmobileを利用してみましょう。
まず、 django-admin.py startproject コマンドでプロジェクトを作成しておき、以下の手順でbpmobileを有効にします。
settings.py の INSTALLED_APPS に bpmobile を追加します。
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'bpmobile', # added
)
settings.py の MIDDLEWARE_CLASSES に必要なミドルウェアクラスを追加します。
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'bpmobile.middleware.BPMobileMiddleware', # added
'bpmobile.middleware.BPMobileConvertResponseMiddleware', # added
)
settings.py の TEMPLATE_CONTEXT_PROCESSORS に必要なコンテキストプロセッサを追加します。
from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
'bpmobile.context_processors.agent', # added
)
TEMPLATE_CONTEXT_PROCESSORS は、生成された settings.py では省略されているので上記のように書いています。
以上でbpmobileが有効になります。
manage.py startapp コマンドで myapp という名前のアプリケーションを作成して、 INSTALLED_APPS に追加しておきます。
プロジェクトの urls.py で myapp.views.my_view を追加しておきます。
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^$', 'myapp.views.my_view'),
)
myapp/views.py にmy_viewを実装します。
# coding:utf-8
from django.http import HttpResponse
def my_view(request):
if request.agent.is_docomo():
return HttpResponse(u'DoCoMoです。')
elif request.agent.is_ezweb():
return HttpResponse(u'EZWebです。')
elif request.agent.is_softbank():
return HttpResponse(u'SoftBankです。')
else:
return HttpResponse(u'その他です。')
manage.py runserver コマンドを実行して、ウェブブラウザで確認してみましょう。通常、PCからの場合には “その他です。” と表示されるはずです。他のAgentを試す場合には、firemobilesimulatorなどを利用すると便利です。
テンプレートでも同様に agent コンテキストを利用して、判定を行うことができます。
urls.py で汎用ビューの direct_to_template を使うように変更します。
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^$', 'django.views.generic.simple.direct_to_template', {'template': 'index.html'}),
)
myapp/templates/index.html にテンプレートを作成します。
{% if agent.is_docomo %}
DoCoMoです。
{% else %}
{% if agent.is_ezweb %}
EZWebです。
{% else %}
{% if agent.is_softbank %}
SoftBankです。
{% else %}
その他です。
{% endif %}
{% endif %}
{% endif %}
以上です。このコードは前述のビューでキャリアの判別を行った例と同様の動作します。
フォームの入力時に英数やひらがななどの入力フォーマットの指定を行うことができます。
urls.py で myapp.views.my_view を使うように変更しておきます。
myapp/views.py でフォームを使うように変更します。
from django.views.generic.simple import direct_to_template
from django import forms
class MyForm(forms.Form):
my_field = forms.CharField()
def my_view(request):
form = MyForm()
return direct_to_template(request, 'index.html', {'form': form})
myapp/templates/index.html で mobile テンプレートタグセットをロードし、 mobile_input_format タグにフォームのフィールドと入力フォーマットを指定します。
{% load mobile %}
<?xml version="1.0" encoding="{% mobile_encoding %}"?>
<!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.1) 1.0//EN" "i-xhtml_4ja_10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset={% mobile_encoding %}" />
<title></title>
</head>
<body>
<form>
{% mobile_input_format form.my_field alphabet %}
</form>
</body>
</html>
mobile_input_formatはスタイルシートによる指定を行うため、XHTML+CSSを使えるようにしています。
DoCoMo端末は一部機種を除いてCookieに対応していないため、Djangoのセッションミドルウェアでセッションを利用することができません。django-bpmobileではDoCoMo端末の場合にiモードIDを利用するセッションミドルウェアを提供しています。
django-bpmobileのセッションミドルウェアを利用するには、 settings.py の MIDDLEWARE_CLASSES に必要なミドルウェアクラスを追加します。
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'bpmobile.middleware.BPMobileMiddleware', # added
'bpmobile.middleware.BPMobileConvertResponseMiddleware', # added
'bpmobile.middleware.BPMobileSessionMiddleware', # added
)
設定は以上です。これでセッションを利用できます。DoCoMo端末ではGETパラメータに guid=on が含まれていないとiモードIDを取得できないため、このパラメータが含まれないリクエストに対しては、 guid=on を付与したURLに自動的にリダイレクトレスポンスを返します。
iモードIDはHTTPSでは利用できないため、このセッションミドルウェアはHTTP専用です。
独自にセッションミドルウェアを書いて対応する必要があります。
良いコードがあるなら是非パッチを下さい:-)
bpmobileでは、限定的ですが絵文字の取り扱いをサポートしています。
単純に表示するだけであれば、DoCoMoの絵文字コードをそのまま埋め込むことで表示することができます。EZWeb、SoftBankではこの場合、各キャリアのサーバで変換されるようです。
しかし、絵文字を表示するためのフォントや入力するソフトウェアが必要な点を考え、django-bpmobileではemojiを代替のタグで記述可能にしています。
emoji を利用することで絵文字を表示することができます。
{% emoji "識別名" %}
emoji タグ用の識別名は現在Table for Working Draft Proposal for Encoding Emoji SymbolsのName&Annotationsを使用しています。
{% emoji "BLACK SUN WITH RAYS" %}
コンテキストの絵文字を表示する場合は emojicontents タグをを利用します。
django-bpmobileのテンプレートタグセットを利用するには、テンプレート内に以下の内容を記述します。
{% load mobile %}
このテンプレートタグセットを利用する場合には、agentコンテキストプロセッサを有効にする必要があります。
emojicontents~endemojicontents間の絵文字コードをDoCoMoのコードに変換します。
{% emojicontents %} ... {% endemojicontents %}
Django標準のurlタグと同等ですが、DoCoMoのAgentに対して guid=on パラメータを自動的に付与します。 _params にはGETパラメータを指定することができます。 _anchor にアンカーを指定することができます。 _noguid を入れると guid=on を付与しません。
{% mobileurl some_view arg1,arg2,name1=value1,_params=param1=val1¶m2=val2,_anchor=foo,_noguid %}
1行テキストフィールドに対して、英数、かな、数字などの入力フォーマットを指定します。
{% mobile_input_format some_form.field format %}
1つ目の引数には、フォームインスタンスのフィールドを指定します。2つ目の引数に入力フォーマットを指定します。このタグは、指定したフィールドに対してウィジェットを独自のものに差し替えてレンダリングを行います。指定できる入力フォーマットは以下の通りです。
フォーマット | 意味 |
---|---|
hiragana | ひらがな |
hankana | 半角カナ |
alphabet | アルファベット(英数) |
numeric | 数字 |
キャリアごとに制限が違うので、必ずこの入力になるとは限りません。入力値の検証は必ず行ってください。
キャリアごとで使用される文字コード名を出力します。
{% mobile_encoding %}
出力される文字列は以下の通りです。
DoCoMo | au(EZWeb) | SoftBank |
---|---|---|
Shift_JIS | Shift_JIS | UTF-8 |
キャリアごとに推奨されるラスターイメージフォーマットの拡張子文字列を出力します。
{% gif_or_png %}
出力される文字列は以下の通りです。
DoCoMo | au(EZWeb) | SoftBank |
---|---|---|
gif | png | png |
現在はGIFに統一することでもおおむね問題ないそうですが(詳細は未確認)、歴史的な事情もありこのタグを残しています。
django-bpmobileでは、モバイル開発をサポートするためにいくつかのミドルウェアを提供しています。
キャリア判別を行い、request.agentにuamobileのagent情報を与えます。また、GET/POSTパラメータの絵文字をDoCoMoコードに変換します。
キャリアごとに推奨する文字コードでresponseをエンコードします。 文字コードは以下の通りです。
DoCoMo | au(EZWeb) | SoftBank |
---|---|---|
cp932 | cp932 | utf8 |
uamobileのAgentオブジェクトです。
{% if agent.is_docomo %}
DoCoMo端末です。
{% endif %}
モデル名は {{ agent.model }} です。
このコンテキストプロセッサを利用するには、 settings.py の TEMPLATE_CONTEXT_PROCESSORS に bpmobile.context_processors.agent を追加します。
2009年9月現在、NTT DoCoMoが公開しているiモードHTMLシミュレータIIはiモードIDに対応していません。django-bpmobileでは、Djangoの runserver コマンドの代わりに、サーバサイドでiモードIDのシミュレーションをサポートする runserver_imode コマンドを提供しています。iアプリの開発で利用することもできます。
$ python manage.py runserver_imode --guid=1234567
django-bpmobileのデフォルト出力文字コード以外のコードで、レスポンスを返したい場合には encoded_response デコレータを使用します。
from django.http import HttpResponse
from bpmobile.decorators import encoded_response
@encoded_response(encoding='cp932', charset='Shift_JIS', content_type='text/html')
def some_view(request):
return HttpResponse(u'これはどのキャリアでもShift_JISになります。')
django-bpmobileのライセンスは修正BSDライセンス(New BSD License)です。詳しくは、LICENSEを参照してください。
また、いくつかのオープンソース、フリーソフトウェアプロダクトが同梱されています。詳しくは COPYING_ で始まるファイルを参照してください。