None

django-bpmobile ドキュメント

目次:

概要

django-bpmobileはDjangoフレームワーク向けのモバイルサイト開発支援モジュールです。日本の携帯電話キャリアのうち、NTT DoCoMoauSoftbankのデバイスに対応しています。Djangoの標準機能ではサポートされない以下の機能を提供します。

  • キャリア機種判別
  • キャリアに応じた文字コード変換
  • テキストフィールドの入力フォーマット指定
  • 絵文字
  • iモードIDを利用したセッション

ダウンロード

現在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を利用してみましょう。

bpmobileを有効にする

まず、 django-admin.py startproject コマンドでプロジェクトを作成しておき、以下の手順でbpmobileを有効にします。

settings.pyINSTALLED_APPSbpmobile を追加します。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'bpmobile', # added
)

settings.pyMIDDLEWARE_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.pyTEMPLATE_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.pymyapp.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.pymyapp.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.htmlmobile テンプレートタグセットをロードし、 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.pyMIDDLEWARE_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コンテキストプロセッサを有効にする必要があります。

emoji

DoCoMoの絵文字コードを挿入します。

{% emoji "識別名" %}

識別名については、絵文字の識別名を参照してください。

emojicontents

emojicontents~endemojicontents間の絵文字コードをDoCoMoのコードに変換します。

{% emojicontents %} ... {% endemojicontents %}

mobileurl

Django標準のurlタグと同等ですが、DoCoMoのAgentに対して guid=on パラメータを自動的に付与します。 _params にはGETパラメータを指定することができます。 _anchor にアンカーを指定することができます。 _noguid を入れると guid=on を付与しません。

{% mobileurl some_view arg1,arg2,name1=value1,_params=param1=val1&param2=val2,_anchor=foo,_noguid %}

mobile_input_format

1行テキストフィールドに対して、英数、かな、数字などの入力フォーマットを指定します。

{% mobile_input_format some_form.field format %}

1つ目の引数には、フォームインスタンスのフィールドを指定します。2つ目の引数に入力フォーマットを指定します。このタグは、指定したフィールドに対してウィジェットを独自のものに差し替えてレンダリングを行います。指定できる入力フォーマットは以下の通りです。

フォーマット 意味
hiragana ひらがな
hankana 半角カナ
alphabet アルファベット(英数)
numeric 数字

キャリアごとに制限が違うので、必ずこの入力になるとは限りません。入力値の検証は必ず行ってください。

mobile_encoding

キャリアごとで使用される文字コード名を出力します。

{% mobile_encoding %}

出力される文字列は以下の通りです。

DoCoMo au(EZWeb) SoftBank
Shift_JIS Shift_JIS UTF-8

gif_or_png

キャリアごとに推奨されるラスターイメージフォーマットの拡張子文字列を出力します。

{% gif_or_png %}

出力される文字列は以下の通りです。

DoCoMo au(EZWeb) SoftBank
gif png png

現在はGIFに統一することでもおおむね問題ないそうですが(詳細は未確認)、歴史的な事情もありこのタグを残しています。

ミドルウェア

django-bpmobileでは、モバイル開発をサポートするためにいくつかのミドルウェアを提供しています。

BPMobileMiddleware

キャリア判別を行い、request.agentにuamobileのagent情報を与えます。また、GET/POSTパラメータの絵文字をDoCoMoコードに変換します。

BPMobileConvertResponseMiddleware

キャリアごとに推奨する文字コードでresponseをエンコードします。 文字コードは以下の通りです。

DoCoMo au(EZWeb) SoftBank
cp932 cp932 utf8

BPMobileSessionMiddleware

モバイル向けのセッション機能を提供します。au(EZWeb)、SoftBankはCookieを利用します。DoCoMoの場合には、iモードIDとセッションキーを対応させてセッションを利用できるようにします。iモードIDとセッションキーの対はDjangoのキャッシュフレームワークによって保持されます。セッションについてのドキュメントを参照してください。

コンテキストプロセッサ

agent

uamobileのAgentオブジェクトです。

{% if agent.is_docomo %}
DoCoMo端末です。
{% endif %}
モデル名は {{ agent.model }} です。

このコンテキストプロセッサを利用するには、 settings.pyTEMPLATE_CONTEXT_PROCESSORSbpmobile.context_processors.agent を追加します。

その他

iモードIDを利用する

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_ で始まるファイルを参照してください。

インデックス