Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Gargoyle コトハジメ

Gargoyle コトハジメ

更新:2013-10-15
バージョン:0.0.4
作者:@voluntas
URL:http://voluntas.github.io/

概要

github:https://github.com/disqus/gargoyle
doc:http://gargoyle.readthedocs.org/en/latest/index.html

Gargoyle は DISQUS が開発した Django のためのスイッチ機能です。 様々な条件を元に特定の機能を有効/無効にすることが出来ます。

かなりシンプルに出来ているため様々な場面で使えると思います。

目的

  • あまりにもドキュメントの説明が足りてないのでドキュメントっぽいのを残す
    • というかドキュメント古いので使えるドキュメントを残す
  • Gargoyle を使ってビューの切り替えを行えるようにする
  • Gargoyle を使ってビューの中身の切り替えを行えるようにする
  • Gargoyle を使って Django ユーザの 50% のみ表示するビューを用意する
  • Gargoyle を使って HTTP ヘッダーの REMOTE_ADDR を判定し 50% のみ表示するビューを用意する
  • Gargoyle を使って特定のユーザのみに表示されるアプリを用意する

セットアップ

$ pip install gargoyle

後は settings.py にいくつかの設定を追加します

INSTALLED_APPS = (
    ...
    'gargoyle',
    ...
)

GARGOYLE_AUTO_CREATE = False

GARGOYLE_AUTO_CREATE を True にすると自動でコンディションを作成してしまうため、明示的に False にしておきます。

サンプルコード

これはそのうち消す

記事を書くためのサンプルコード

from django.contrib.auth.models import User, AnonymousUser
from django.http import HttpRequest

from gargoyle import gargoyle
from gargoyle.models import Switch, SELECTIVE
from gargoyle.builtins import UserConditionSet, IPAddressConditionSet

user_condition_set = UserConditionSet(User)

switch = Switch.objects.create(key='spam', status=SELECTIVE)
switch = gargoyle['spam']

switch.add_condition(
    condition_set = user_condition_set.get_id(),
    field_name = 'percent',
    condition = '0-50',
)

user = AnonymousUser()
assert not gargoyle.is_active('spam', user)

# 51 = 51 % 100
user = User(pk=51)
assert not gargoyle.is_active('spam', user)

# 5 = 5 % 100
user = User(pk=5)
assert gargoyle.is_active('spam', user)

switch.clear_conditions(
    user_condition_set.get_id(),
    'percent',
)

assert not gargoyle.is_active('spam', user)


ip_address_condition_set = IPAddressConditionSet()

Switch.objects.create(
    key='egg',
    status=SELECTIVE,
)
switch = gargoyle['egg']

switch.add_condition(
    condition_set = ip_address_condition_set.get_id(),
    field_name = 'percent',
    condition = '0-50',
)

request = HttpRequest()
# 95 = sum([int(x) for x in '192.0.2.1'.split('.')]) % 100
request.META['REMOTE_ADDR'] = '192.0.2.1'

assert not gargoyle.is_active('egg', request)

request = HttpRequest()
# 4 = sum([int(x) for x in '192.0.2.10'.split('.')]) % 100
request.META['REMOTE_ADDR'] = '192.0.2.10'

assert gargoyle.is_active('egg', request)

switch.clear_conditions(
    condition_set = ip_address_condition_set.get_id(),
    field_name = 'percent',
)

assert not gargoyle.is_active('egg', request)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment