2013年2月3日日曜日

Django "sites"フレームワーク を使う

Django のマニュアルによると、1つのインスタンスで複数のサイトを運営できるようなことが書いてある。
http://docs.djangoproject.jp/en/latest/ref/contrib/sites.html#ref-contrib-sites

でも、そもそも、複数のサイトを切り替える手順が、どこにも書いてないんだよね??
ググっても、日本語の情報は無し。

英語のサイトを眺めながら、なんとなく、使えそうな方法を見つけた。

以下は、その手順

1.ミドルウェアの追加

settings.py の MIDDLEWARE_CLASSES に、ミドルウェア(後述)を追加

-- settings.py --
MIDDLEWARE_CLASSES = (
 'mysite.middle.MultiSiteMiddleware',

補足
mysite : プロジェクトのフォルダ名
middle : ファイル名(meddle.py)
MultiSiteMiddleware : クラス名

2.ミドルウェアを書く

アクセスされたドメイン名に対応するサイトID を設定します。

-- mysite.middle.py --
from django.conf import settings
from django.contrib.sites.models import Site
class MultiSiteMiddleware:  
 def process_request(self, request):
  host = request.get_host()
  try:
   site = Site.objects.get(domain=host)
  except Site.DoesNotExist:
   site = Site(domain=host, name=host)
   site.save()
  settings.SITE_ID = site.id

概要
・request.get_host() で、外部からアクセスされたドメイン名(host)を取り出し
・site オブジェクトを get (または、save)
・サイトID(site.id) を、SITE_ID にセット

ミドルウェアが、どのように動作するかは、こちらを参考に。
http://docs.djangoproject.jp/en/latest/topics/http/middleware.html

3.SITE_ID を使う

SITE_ID を get できれば、後は、ドキュメント通りにイロイロ応用できます。


-- views.py --
from django.conf import settings
from django.contrib.sites.models import Site
sid = settings.SITE_ID
site = Site.objects.get(id=sid)
# site.id, site.domain, site.name

余談ですが..
"sites"フレームワーク を使えば、ドメイン毎に、Apache の バーチャルホストを設定する必要はありません。


2013/02/17 追記

settings.SITE_ID = site.id では、SITE_ID をキチンとセットできないみたい。

さらに、ググってみると、こちらを見つけた。

http://djangosnippets.org/snippets/1099/

1.設定ファイル

-- settings.py --
from site_id_hook import SiteIDHook, SITE_THREAD_INFO
SITE_ID = SiteIDHook()

MIDDLEWARE_CLASSES = (
 'mysite.site_middleware.SiteOnFlyDetectionMiddleware',
 …
)

※ site_middleware は、MIDDLEWARE_CLASSES の先頭に記述します。

2.SITE_ID 取得

-- site_id_hook.py --
from threading import local
SITE_THREAD_INFO = local()
class SiteIDHook:
 def __int__(self):      
  return SITE_THREAD_INFO.SITE_ID
 def __hash__(self):      
  return SITE_THREAD_INFO.SITE_ID

3.ミドルウェア

-- site_middleware.py --
from django.conf import settings
from django.contrib.sites.models import Site
class SiteOnFlyDetectionMiddleware:  
 def process_request(self, request):
  host = request.get_host()
  try:
   site = Site.objects.get(domain=host)
  except Site.DoesNotExist:
   site = Site(domain=host, name=host)
   site.save()
  settings.SITE_THREAD_INFO.SITE_ID = site.id

今渡こそ、大丈夫かな??

Django1.4 で intcommaが効かない

intcomma とは、整数を三桁ごとにカンマで区切った形式の文字列に変換してくれる、賢い奴です。

使い方は、

1.settings.py

INSTALLED_APPS 設定に 'django.contrib.humanize' を追加

2.テンプレート

テンプレートの冒頭に {% load humanize %} を追加

3.テンプレートタグ

{{ <変数(整数)>|intcomma }} と書く


ドキュメントを読んでも、1.3 との違いは書かれて無いので、しばし悩んだ。
http://docs.djangoproject.jp/en/latest/ref/contrib/humanize.html

このような書き込みを見つけて、無事解決。
> Django 1.4になってからintcommaが効かないと思ったら、1.4からintcommaがL10Nを気にするようになってた。ロケールjaではNUMBER_GROUPINGが設定されていないので、明示的にNUMBER_GROUPING=3としてやらないといけない様子

settings.py に一行追加。

NUMBER_GROUPING=3

2013年2月2日土曜日

イオンSIM から ServersMan SIM 3G 100 に乗り換え

ServersMan@VPS を使い始めたので、ついでに、モバイル回線も引っ越した。
イオンSIM が 980円/月 なのに対して、ServersMan SIM 3G 100 は 490円/月と半額に。
ServersMan@VPS(490円/月)と合わせて、ちょうど同額なんだから、笑っちゃうよね。

速度は、ほとんど変わらないかな??
150kbps くらい出る時もあるので、イオンSIM より早いかも??

VoIP の無料通話アプリは使って無いけど、そろそろ Line でも入れておこうかと思案中。
イオンSIM は、あちこちのサイトで「VoIP は無理」と書かれていたので、はなから諦めていたんだけどね。

これで、また、LTE から遠のいてしまった.. (^^;;