Djangoチャンネルと@channel_session_user
デコレータを使用しています(Djangoのセッションデータにアクセスするため)。Djangoチャンネルのコンシューマのテスト: "回答が返されません"
@channel_session_user_from_http
def ws_connect(message):
# creates group names like "group-1"
group_kw = get_group_id_for_user(message.user)
Group(group_kw).add(message.reply_channel)
@channel_session_user
def ws_receive(message):
group_kw = get_group_id_for_user(message.user)
payload = json.loads(message.content['text'])
Channel(payload['action']).send(message.content)
@channel_session_user
def ws_disconnect(message):
group_kw = get_group_id_for_user(message.user)
Group(group_kw).discard(message.reply_channel)
これは問題なく動作しますが、テストするときに問題があります。
以下のテストでは、websocket.receive
チャネルにメッセージを配置し、次にws_receive
はメッセージを受け取り、メッセージのaction
値で定義されたチャネルに配置する必要があります。最後に、実際にそのチャンネルに配置されているかどうかをテストします。
def test_send_chat_message_is_used_by_consumer(self):
# Make sure a user is authenticated
self.assertTrue(auth.get_user(self.client).is_authenticated())
payload = {'action': 'chat.receive',
'msg': 'Test message.',
'receiver': self.user2.id}
message = {'text': json.dumps(payload)}
# Send a chat message
Channel('websocket.receive').send(message)
# Receive it and place it on the right channel
ws_receive(self.get_next_message('websocket.receive', require=True))
# Fetch it from the channel
result = self.get_next_message(payload['action'], require=True)
# That should be the message sent
self.assertEqual(result, message)
代わりに、私はws_receive()
呼び出しで行を指して、次のエラーを取得します。
ValueError: No reply_channel sent to consumer; @channel_session can only be used on messages containing it.
チャンネルソースでエラーis raised here。
reply_channel
を印刷すると、正しい返信チャネル名を含む代わりにNone
が返されます。
tmp = self.get_next_message('websocket.receive', require=True)
print(tmp.reply_channel) # prints: None
わかりやすいものを見落としていますか?