2012-05-04 8 views
4

ここで説明するのと同様のアーキテクチャを持つDjangoアプリでリアルタイム更新を追加しようとしています:http://lincolnloop.com/blog/2012/apr/23/ginger-tech-stack/。基本的に、アップデートはDjangoからRedis経由でNode.jsに送られ、Socket.ioで接続されたクライアントにプッシュされます。現時点では、私は接続されているすべてのクライアントにブロードキャストできますが、実際のケースでは、アクションによって関連するクライアントにのみデータを送信する必要があります(ユーザーがメッセージを投稿し、連絡先/ですから、誰が誰かを知るために、Node.js側で何らかの認証が必要です。これはどのように達成できますか? Djangoの側ではDjango/Redis/Node.jsを使用したリアルタイムプッシュ/プル

をここで
+1

は同じホスト名であり、そしてあなたは、Djangoの中にクッキーベースの認証を有し、したがって、ノードは、それらのCookieを読み取ることができ、あなたはノードのために、Djangoの認証用のアダプタを書くことができます。 –

+0

私はデータベースベースのセッションからクッキーベースのセッションに移行し、ノード側で«セッションID»クッキーを読むことができます。だから、私は[この機能](https://github.com/django/django/blob/master/django/core/signing.py#L134)をノードに移植する必要があると思います... – djevg

+0

申し訳ありません - 私はいませんでしたあなたがNodeから同じデータベースにアクセスできるのであれば、dbでバックアップされたセッションを使うことができるはずです。セッションIDのためにクッキーを使うことを意味していました。どちらの解決策もうまくいくはずです。ええ、[ノードの暗号モジュール](http://nodejs.org/api/crypto.html)があなたの友人になります。 –

答えて

1

は(あなたがよりよい解決策を持っている場合は、投稿して自由に感じる)socket.io/node.jsに接続されているユーザーのIDを取得するには、これまで私のソリューションです。
  • パッチジャンゴストアセッションデータにJSONの代わりにピクルスオブジェクトを使用する:

    diff --git a/django/contrib/sessions/backends/base.py b/django/contrib/sessions/backends/base.py 
    index 5a637e2..cb4db54 100644 
    --- a/django/contrib/sessions/backends/base.py 
    +++ b/django/contrib/sessions/backends/base.py 
    @@ -2,9 +2,9 @@ 
    import time 
    from datetime import datetime, timedelta 
    try: 
    - import cPickle as pickle 
    + import json 
    except ImportError: 
    - import pickle 
    + import simplejson as json 
    
    from django.conf import settings 
    from django.core.exceptions import SuspiciousOperation 
    @@ -75,21 +75,21 @@ def _hash(self, value): 
         return salted_hmac(key_salt, value).hexdigest() 
    
        def encode(self, session_dict): 
    -  "Returns the given session dictionary pickled and encoded as a string." 
    -  pickled = pickle.dumps(session_dict, pickle.HIGHEST_PROTOCOL) 
    -  hash = self._hash(pickled) 
    -  return base64.encodestring(hash + ":" + pickled) 
    +  "Returns the given session dictionary as json and encoded as a string." 
    +  data = json.dumps(session_dict) 
    +  hash = self._hash(data) 
    +  return base64.encodestring(hash + ":" + data) 
    
        def decode(self, session_data): 
         encoded_data = base64.decodestring(session_data) 
         try: 
          # could produce ValueError if there is no ':' 
    -   hash, pickled = encoded_data.split(':', 1) 
    -   expected_hash = self._hash(pickled) 
    +   hash, data = encoded_data.split(':', 1) 
    +   expected_hash = self._hash(data) 
          if not constant_time_compare(hash, expected_hash): 
           raise SuspiciousOperation("Session data corrupted") 
          else: 
    -    return pickle.loads(pickled) 
    +    return json.loads(data) 
         except Exception: 
          # ValueError, SuspiciousOperation, unpickling exceptions. If any of 
          # these happen, just return an empty dictionary (an empty session). 
    
Node.jsの側では

  • "セッションID" クッキーからセッション鍵を読む:

    socket.on('connection', function(client) { 
        ... 
        var cookie_string = client.handshake.headers.cookie; 
        var parsed_cookies = connect.utils.parseCookie(cookie_string); 
        var sessionid = parsed_cookies['sessionid']; 
        ... 
    }); 
    
  • にセッションIDに対応するDBからセッションデータをデコード&を取得ユーザーIDを取得します。ジャンゴとノードを想定すると、

+0

独自のセッションバックエンドを書くことができる時にDjangoにパッチを当てるのはなぜですか? –

+0

うん、おそらく本当に良い。だから私はDjango dbセッションバックエンドを拡張しようとしました:https://gist.github.com/9ef870e91dc034f60179しかし、それは正しく動作していません。何が間違っているかわからない...私はログインすることができます、クッキーとdbエントリは正しく作成されているようですが、login_required保護されたビューにアクセスしているときに、ログインページにリダイレクトされます... – djevg

関連する問題