如何从Django频道获取查询参数?

Ber*_*rry 3 python django websocket django-channels

我需要从Django Channels访问查询参数dict.

网址可能如下所示: ws://127.0.0.1:8000/?hello="world"

我如何检索这样的'世界':query_params["hello"]

clo*_*her 7

在websocket连接上,message.content字典包含query_string.

import urlparse
def ws_connect(message):
    params = urlparse.parse_qs(message.content['query_string'])
    hello = params.get('hello', (None,))[0]
Run Code Online (Sandbox Code Playgroud)

入门文档(http://channels.readthedocs.io/en/stable/getting-started.html)意味着query_string作为message.content路径的一部分包含在内,但似乎并非如此.

下面是一个工作的consumer.py,用于聊天应用程序示例,其中房间在查询字符串中传递:

import urlparse
from channels import Group
from channels.sessions import channel_session

@channel_session
def ws_message(message):
    room = message.channel_session['room']
    Group("chat-{0}".format(room)).send({"text": "[{1}] {0}".format(message.content['text'], room)})

@channel_session
def ws_connect(message):
    message.reply_channel.send({"accept": True})
    params = urlparse.parse_qs(message.content['query_string'])
    room = params.get('room',('Not Supplied',))[0]
    message.channel_session['room'] = room
    Group("chat-{0}".format(room)).add(message.reply_channel)

@channel_session
def ws_disconnect(message):
    room = message.channel_session['room']
    Group("chat-{0}".format(room)).discard(message.reply_channel)
Run Code Online (Sandbox Code Playgroud)

  • 在通道 2 中,等效的是 `scope['query_string']`,它返回一个字节字符串。所以如果你想在消费者中使用 unicode 字符串,你可以使用 `parse_qs(self.scope['query_string'].decode('utf8'))` (3认同)