【Facebook】Facebookアプリが持つアクセストークンを取得【アプリ】

2012年1月24日火曜日 16:29 By Unknown , In

FacebookはOAuth2.0に対応しているのでユーザーとアプリが紐づいたアクセストークンというものを発行してくれるのですが、どうやらアプリ自体が持つアクセストークンってのも在るようです。
以下のURLにアクセスすると取得出来るみたいです。
[APP_ID]と[APP_SECRET]は各自適宣変更して下さいね。

https://graph.facebook.com/oauth/access_token?client_id=[APP_ID]&client_secret=[APP_SECRET]&grant_type=client_credentials

Request Dialogを使ってアプリへの招待を送った際に発行される、リクエストオブジェクトを取得する時なんかに使用出来ます。

【Facebook】Facebookアプリでlocalhostを指定する為のアレ【アプリ】

12:01 By Unknown , In

Facebookアプリを作る機会があったので色々と調べていたのですが、OAuth認証のコールバックにはlocalhostを指定出来ないみたいでちょっと困った。
ので、hostsを書き換えて無理やりやりましょうって事でやってみたら上手く行きました。

hostsの設定は以下のとおり。 コレを/etc/hostsのどっかに書いておいて下さい。

127.0.0.1    local.examples.com

で、Facebookアプリの設定。
【アプリのドメイン】の所に上記で設定したドメインを追加。
下の方にある【ウェブサイト】のところも忘れずに。

後は設定したドメインにアクセスすれば問題なく動きますよ。

ついでにキャンバスページも同様に出来るので設定してみると幸せになれるかも。

余談ですが、Djangoのテストサーバーがlocalhost:8000で動いてるんですけども、Nginx使ってリバースプロキシってやると幸せになりました。
便利な世の中ですね。

【Python】Modelクラスでclean_[field_name]メソッドを使う【Django】

2012年1月12日木曜日 18:44 By Unknown , In ,

Djangoのforms.Formクラスにあるアレです。
Modelにも実装してくれればいいのに。。

Modelにもカスタムバリデーション用のcleanメソッドがありますけども、あすこでValidationErrorを投げるとどんな設定してもNON_FIELD_ERRORSのエラーになってしまいます。
こりゃー使いづらいぜーという事なのでFormクラスと似たような事が出来るようにMixinを使って実装をしてみました。
と言ってもDjangoのソースパクって数行追加するだけですけども。

#-*-coding=utf8-*-

from django.core.exceptions import ValidationError

class CleanFieldModelMixin(object):
  """clean_[field_name]メソッドが使えるようになります。"""
  
  def clean_fields(self, exclude=None):
    if exclude is None: exclude = []

    errors = {}
    for f in self._meta.fields:
      if f.name in exclude: continue

      raw_value = getattr(self, f.attname)
      if f.blank and raw_value in validators.EMPTY_VALUES: continue
      
      try:
        setattr(self, f.attname, f.clean(raw_value, self))
        if hasattr(self, 'clean_%s' % f.name):
          value = getattr(self, 'clean_%s' % f.name)()
          setattr(self, f.attname, value)
      except ValidationError, e:
        errors[f.name] = e.messages

    if errors:
      raise ValidationError(errors)

んで、実際の使い方はこんな感じ

#-*-coding=utf8-*-

from django.db import models
from django.core.exceptions import ValidationError
from utils.models import CleanFieldModelMixin # 適当にして下さいな。

# MixinクラスはModelクラスより先に書いてくださいね!
class User(CleanFieldModelMixin, models.Model):
  name = models.CharField('name', max_length=60)
  
  def clean_name(self):
    count = User.objects.filter(name=self.name).count()
    if count > 0:
      raise ValidationError('%s is already exists.' % self.name)

これで動く。
多分動く。。