2010-12-07 16 views
0

シグナルを使用してログインしようとしているユーザーのIPアドレスを記録しようとしています。これはどうすればいいですか?Django:シグナルを使用してIPアドレスを取得する

私はログインの日時をすでに取得しています。

#models.py 
class UserLogin(models.Model): 
    """user details when logging in"""   
    user  = models.ForeignKey(User) 
    timestamp = models.DateTimeField(auto_now=True) 

これは信号のためです:

#models.py 
def user_login_save(sender, instance, **kwargs): 
if instance.last_login: 
    old = instance.__class__.objects.get(pk=instance.pk) 
    if instance.last_login != old.last_login: 
     instance.userlogin_set.create(timestamp=instance.last_login) 

models.signals.post_save.connect(user_login_save, sender=User) 

私が使用してIPアドレスを取得する方法を知っているものの:request.METAは[REMOTE_ADDR]私の問題は、私は私のモデルに要求インスタンスを使用することができないということです。要求から何かを得ることが良い習慣であるかどうかも私は確信していません。

これを行う推奨方法は何ですか?

ご返信いただければ幸いです。

よろしく、 Wenbert

答えて

1

私が使用してIPアドレスを取得する方法を知っているものの:request.METAは[REMOTE_ADDR]私の問題は、私は私のモデルに要求インスタンスを使用することができないということです。

あなたはビュー機能を持っています。

リクエストから何かを得ることが良い方法であるかどうかはわかりません。

これは完全に問題ありません。

  • これは、リクエストがすべてのビュー機能に提供される理由です。

  • これは、ビュー機能を持つ理由です。

ビュー機能で行うだけです。新しい種類のデータベースインターフェイスを作成していない限り、シグナルを混乱させないでください。

+0

答えはありませんが、良いアドバイスです... –

+0

@ Frost.baka:答えだと思います。その答えは「それはやってはいけない」ということです。 –

+0

私はdjangoを初めて使用していますが、私はビュー(myapp/user/login(?))を持たないデフォルトのdjango認証を使用しています。私はIPアドレスを追加して渡すことができるように、ログインのデフォルトビューを "どのように"拡張するのですか?私の理解では、私は私の視点でIPアドレスを取得し、どこかにそれを渡すだろう... – wenbert

1

インスタンスがシグナルに渡され、インスタンスが実際に保存されているオブジェクトと同じであるため、インスタンスを保存するときにインスタンスにリクエストオブジェクトまたはIPを添付できます。

user_login.request=request 
user_login.save() 

そして

instance.request 
0

のような信号でそれを取得Djangoは信号を持っているということで、ユーザのログがuser_logged_inと呼ばれているときに起動します。シグナルハンドラをこのシグナルに付けることで、ログインイベントを通知することができます。ハンドラにはuserrequestオブジェクトが渡されます。 IPアドレスはrequestオブジェクトから取得できます。

関連する問題