[英]How to get current user from a Django Channels web socket packet?
我正在學習本教程: 最后,實時Django在這里:Django Channels入門 。
我想通過使用Django User對象而不是handle
變量來擴展應用程序。 但是,如何從ws_recieve(message)
函數中收到的WebSocket數據包中獲取當前用戶?
我注意到, csrftoken
和來自Web套接字數據包的sessionid
的前十個數字都與正常的HTTP請求匹配。 我可以獲取當前用戶的信息嗎?
作為參考,接收到的數據包如下所示:
{'channel': <channels.channel.Channel object at 0x110ea3a20>,
'channel_layer': <channels.asgi.ChannelLayerWrapper object at 0x110c399e8>,
'channel_session': <django.contrib.sessions.backends.db.SessionStore object at 0x110d52cc0>,
'content': {'client': ['127.0.0.1', 52472],
'headers': [[b'connection', b'Upgrade'],
[b'origin', b'http://0.0.0.0:8000'],
[b'cookie',
b'csrftoken=EQLI0lx4SGCpyTWTJrT9UTe1mZV5cbNPpevmVu'
b'STjySlk9ZJvxzHj9XFsJPgWCWq; sessionid=kgi57butc3'
b'zckszpuqphn0egqh22wqaj'],
[b'cache-control', b'no-cache'],
[b'sec-websocket-version', b'13'],
[b'sec-websocket-extensions',
b'x-webkit-deflate-frame'],
[b'host', b'0.0.0.0:8000'],
[b'upgrade', b'websocket'],
[b'sec-websocket-key', b'y2Lmb+Ej+lMYN+BVrSXpXQ=='],
[b'user-agent',
b'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) '
b'AppleWebKit/602.1.50 (KHTML, like Gecko) Version'
b'/10.0 Safari/602.1.50'],
[b'pragma', b'no-cache']],
'order': 0,
'path': '/chat-message/',
'query_string': '',
'reply_channel': 'websocket.send!UZaOWhupBefN',
'server': ['127.0.0.1', 8000]},
'reply_channel': <channels.channel.Channel object at 0x110ea3a90>}
注意 :該問題特定於Channels 1.x
和Django
會話系統,如果您使用Channels 2.x
方法,請閱讀下面鏈接中的文檔,他們對於如何執行此操作非常清楚, Channels 1.x
文檔使某些人(包括我)感到困惑,這就是為什么這個問題和其他問題引起的原因, Channels 2.x
文檔非常清楚如何實現此目的:
https://channels.readthedocs.io/zh-CN/latest/topics/authentication.html#django-authentication
您可以通過更改consumers.py
的修飾符以匹配文檔來訪問message
的user
和http_session
屬性:
您可以使用
http_session decorator
訪問用戶的常規Django會話-這會向您提供message.http_session
屬性,其行為類似於request.session
。 您可以進一步使用http_session_user
,它將提供message.user
屬性以及session屬性。
因此示例中的consumers.py
文件應如下所示:
from channels.auth import http_session_user, channel_session_user, channel_session_user_from_http
@channel_session_user_from_http
def ws_connect(message):
...
...
@channel_session_user
def ws_receive(message):
# You can check for the user attr like this
log.debug('%s', message.user)
...
...
@channel_session_user
def ws_disconnect(message):
...
...
請注意裝飾器更改 。
另外,我建議您不要在該示例上構建任何東西
有關更多詳細信息,請參見: https : //channels.readthedocs.io/en/1.x/getting-started.html#authentication
通過docs在2018年更新了答案:
要訪問用戶,只需在使用者代碼中使用self.scope [“ user”]:
class ChatConsumer(WebsocketConsumer):
def connect(self, event):
self.user = self.scope["user"]
def receive(self, event):
username_str = None
username = self.scope["user"]
if(username.is_authenticated()):
username_str = username.username
print(type(username_str))
#pdb.set_trace() # optional debugging
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.