bpcommons ドキュメント

bpcommonsとは?

bpcommonsはDjango用のプロジェクト共有ライブラリです。

目次:

Ajax/JSONの処理

ブラウザのJavascriptから、AJAXデータ通信をよくしますが、 面倒な部分はいっぱいあります。標準Djangoでは、HttpResponseで mimetypeを指定した上、返すデータをJSONに直列化することも必要です。

from django.contrib.auth.models import User
from django.utils import simplejson

def myajax_view(request):
    user = User.object.get(pk=request.GET["id"])
    return HttpResponse(simplejson.dumps({
        "username": user.username,
        "fullname": user.get_full_name(),
    }), mimetype="text/javascript")

上のやり方にしても、decimal.Decimal, datetime.datetime, DjangoのLazyObjectなどを 直列化することができません。

bpcommonsはAJAXをもっと簡単にできるようにいろなツールが揃えています。

commons.views.decoratorsajax_view デコレーターを定義しています。

ajax_request()

ajax_request をビュー関数につけると、ビューから返したデータをそのまま、 JSONに書き換える:

from django.contrib.auth.models import User
from commons.views.decorators import ajax_request

@ajax_request
def myajax_view(request):
    user = User.object.get(pk=request.GET["id"])
    return {
        "username": user.username,
        "fullname": user.get_full_name(),
    }

HttpResponse オブジェクトを返すこともできます。 HttpResponseを返した場合、 response をajax_requestはJSONに変換せずにそのまま返す:

from django.contrib.auth.models import User
from commons.views.decorators import ajax_request

@ajax_request
def myajax_view(request):
    user = User.object.get(pk=request.GET["id"])
    if user != request.user:
        return HttpResponseBadRequest(u"不正なリクエスト")
    return {
        "username": user.username,
        "fullname": user.get_full_name(),
    }

commons.forms.decorators -- フォームデコレーター

commons.forms.decorators.autostrip()

検証する前に、CharFieldのデータをstripするクラスデコレーター:

class PersonForm(forms.Form):
    name = forms.CharField(min_length=2, max_length=10)
    email = forms.EmailField()

PersonForm = autostrip(PersonForm)

commons.forms.fields -- フォームフィールド

class commons.forms.fields.StripRegexField

検証する前に、strip()をかけるフィールド。さらに、正規表現を指定した 正規表現にマッチするかを検証します:

from django import forms
from commons.forms import StripRegexField

class MyForm(forms.Form):
    name = StripRegexField('^Monty', label=u'名前', error_message=u'名前はMontyから始まらないといけません。')
class commons.forms.fields.EmailField

Djangoは標準に電子メールアドレスのフォームフィールドクラスを用意してありますが、 メールアドレスのフォーマットに厳しい。特に、日本の携帯メールアドレスが標準 Django の EmailField の検証に通らない。というわけで、commons.forms.fields で EmailField が実装されています。

使い方は Django の EmailField と一緒です:

from django import forms
from commons.forms import EmailField

class MyForm(forms.Form):
    email = EmailField(label=u"メールアドレス")
class commons.forms.fields.AlphaNumField

半角英数字と"_","-"のみ許容するフィールド:

from django import forms
from commons.forms import AlphaNumField

class MyForm(forms.Form):
    username = AlphaNumField(label=u'ユーザ名')
class commons.forms.fields.NumCharField

NumCharField は数字のみを許容するフィールド:

from django import forms
from commons.forms import NumCharField

class MyForm(forms.Form):
    voucher_id = NumCharField(label=u'伝票ID')
class commons.forms.fields.FullWidthCharField

全角文字のみを許容するフィールド:

from django import forms
from commons.forms import FullWidthCharField

class MyForm(forms.Form):
    name = FullWidthCharField(label=u'名前')

注釈

現在の実装ですと、utf-8のみに対応しています。

class commons.forms.fields.HiraganaCharField

全角ひらがなのみを許容するフィールド:

from django import forms
from commons.forms import HiraganaCharField

class MyForm(forms.Form):
    name = HiraganaCharField(label=u'名前')

注釈

現在の実装ですと、utf-8のみに対応しています。

class commons.forms.fields.JSONField

バージョン 0.37 で非推奨: 削除されました。 https://pypi.python.org/pypi/jsonfield を使用して下さい。

commons.forms.utils -- フォームユティリティ

class commons.forms.utils.Choices

ChoicesはDjangoのforms.ChoiceFieldに使える便利なクラス。普段には ChoiceFieldのchoicesパラメータとして、2-tupleを使いますが、実は イテレータオブジェクトも使えます。Choicesは整数とverboseと文字列名前 をマッピングしてくれて、便利な操作ができます。:

>>> from commons.forms import Choices

>>> STATUSES = Choices(
...     (1, 'live', 'Live'),
...     (2, 'draft', 'Draft'),
...     (3, 'hidden', 'Not Live'),
... )

# choicesリストとして使えます:
>>> list(STATUSES)
[(1, 'Live'), (2, 'Draft')]

# 整数コードから、ラベルに簡単に変換:
>>> STATUSES.verbose(1)
'Live'

# 文字列名前にマッピング
>>> STATUS.prop(1)
'live'

# ... と逆に:
>>> STATUSES.code("draft")
2

# モデルフィールドにchoicesとして使えます
status = models.SmallIntegerField(choices=STATUSES,
...                                       default=STATUSES["live"])

commons.http -- HTTP ユティリティ

class commons.http.JSONResponse

バージョン 0.37 で非推奨: 次のバージョンで削除されます。 django.http.JsonResponse を使用して下さい。

マネージメントコマンド

rmcache [cache key]

指定されたキャッシュキーを削除する。古いデータをキャッシュから削除する場合、 特に、デプロイする時に使うことを予想します:

python manage.py rmcache mycachekey

commons.middleware.debug -- デバグ ミドルウエア

class commons.middleware.debug.DebugMiddleware

SQLクエリをstdoutに出力するミドルウエア。settings.DEBUG は True である場合のみに、 クエリを出力します。

ChangeLog

Release 0.39 (2019-09-17)

Supports:

  • Python-3.6, 3.7 (+ 3.7 / - 2.7)
  • Django-1.11, 2.2 (+ 2.2 / - 1.8, 1.10 that doesn't support py36)
  • Drop dependency: zenhan

Release 0.38 (2017-07-11)

  • Support Python-3.6
  • Support Django-1.11
  • Drop Django-1.9
  • Remove dependency to bputils

Release 0.37 (2016-11-25)

  • Support Django-1.10
  • Drop Python-2.6
  • Drop Django-1.7 or earlier.
  • Deprecate some classes:
    • beproud.django.commons.http.JsonResponse
    • beproud.django.commons.utils.javascript.DjangoJSONEncoder
  • Drop some classes:
    • beproud.django.commons.models.fields.JSONField
    • beproud.django.commons.models.fields.PickledObjectField
    • beproud.django.commons.forms.JSONField
    • beproud.django.commons.forms.widgets.JSONWidget
    • beproud.django.commons.forms.widgets.AdminJSONWidget
  • Drop switch templatetag.
  • Remove 'BigIntegerField' from __all__ of beproud.django.commons.models.fields. Please use django.db.models.BigIntegerField instead.

Please use https://pypi.python.org/pypi/jsonfield instead of our JSONField.

Release 0.36 (2016-03-23)

  • some fixes and improvements

Release 0.35 (2016-01-15)

  • Support Django-1.9
  • some fixes and improvements