如何从 Django Channels 获取查询参数?
How to get query parameters from Django Channels?
我需要从 Django Channels 访问查询参数字典。
url 可能如下所示:ws://127.0.0.1:8000/?hello="world"
如何像这样检索 'world':query_params["hello"]
?
在 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]
入门文档 (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)
频道 3 更新:
from urllib.parse import parse_qs
# Types
class Scope(TypedDict):
query_string: bytes
scope: Scope
query_params: Dict[str, List[str]]
# Parse query_string
query_params = parse_qs(scope["query_string"].decode())
print(query_params["access_token"][-1])
如果您经常这样做,您可以将它放在一个中间件中并将您的 ASGI 应用程序包装在其中。类似于:
class QueryParamsMiddleware(BaseMiddleware):
async def __call__(self, scope, receive, send):
scope = dict(scope)
scope["query_params"] = parse_qs(scope["query_string"].decode())
return await super().__call__(scope, receive, send)
我需要从 Django Channels 访问查询参数字典。
url 可能如下所示:ws://127.0.0.1:8000/?hello="world"
如何像这样检索 'world':query_params["hello"]
?
在 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]
入门文档 (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)
频道 3 更新:
from urllib.parse import parse_qs
# Types
class Scope(TypedDict):
query_string: bytes
scope: Scope
query_params: Dict[str, List[str]]
# Parse query_string
query_params = parse_qs(scope["query_string"].decode())
print(query_params["access_token"][-1])
如果您经常这样做,您可以将它放在一个中间件中并将您的 ASGI 应用程序包装在其中。类似于:
class QueryParamsMiddleware(BaseMiddleware):
async def __call__(self, scope, receive, send):
scope = dict(scope)
scope["query_params"] = parse_qs(scope["query_string"].decode())
return await super().__call__(scope, receive, send)