簡體   English   中英

使用Django / Redis / Node.js實時推/拉

[英]Realtime push/pull with Django/Redis/Node.js

我正在嘗試在Django應用程序上添加實時更新,該應用程序具有與此處所述類似的體系結構: http//lincolnloop.com/blog/2012/apr/23/ginger-tech-stack/ 基本上,更新通過Redis從Django發送到Node.js,然后通過Socket.io推送到連接的客戶端。 現在,我可以向連接的每個客戶廣播,但在實際情況下,我需要通過動作向有關客戶發送數據(例如:用戶發布消息,只有他的聯系人/訂閱者收到此消息)。 所以我需要在Node.js端進行某種身份驗證,以了解誰是誰。 怎么能實現這一目標?

到目前為止,我的解決方案是在socket.io/node.js中獲取已連接用戶的身份(如果您有更好的解決方案,請隨時發布):

在Django方面:

  • 修補Django使用json而不是pickle對象來存儲會話數據:

      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端:

  • 從“sessionid”cookie中讀取會話密鑰:

     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']; ... }); 
  • 從與sessionid對應的db中檢索和解碼會話數據以獲取用戶ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM