我应该在Django中使用WebSocket或REST获取用户ID吗?
我在项目中使用REST进行注册和用户身份验证。当用户登录时,他可以使用WebSocket向后端发送消息。我把他的所有信息都保存到我的数据库里。目前在我的数据库中有我应该在Django中使用WebSocket或REST获取用户ID吗?,django,python-2.7,python-3.x,django-rest-framework,django-channels,Django,Python 2.7,Python 3.x,Django Rest Framework,Django Channels,我在项目中使用REST进行注册和用户身份验证。当用户登录时,他可以使用WebSocket向后端发送消息。我把他的所有信息都保存到我的数据库里。目前在我的数据库中有id和message列。我还想添加向后端发送消息的用户的id。我的模型看起来是这样的: class Message(models.Model): message = models.CharField(max_length=200) 我想做到这一点: from django.contrib.auth.models import
id
和message
列。我还想添加向后端发送消息的用户的id。我的模型看起来是这样的:
class Message(models.Model):
message = models.CharField(max_length=200)
我想做到这一点:
from django.contrib.auth.models import User
class Message(models.Model):
user = models.ForeignKey('auth.User')
message = models.CharField(max_length=200)
我的问题是,我应该如何将用户ID与他的消息一起添加到我的数据库中。应该使用WebSocket发送此用户的ID,或者在REST中使用例如header
consumers.py:
def msg_consumer(message):
text = message.content.get('text')
Message.objects.create(
message=text,
)
Group("chat").send({'text': text})
def ws_connect(message):
# Accept the connection
message.reply_channel.send({"accept": True})
# Add to the chat group
Group("chat").add(message.reply_channel)
message.reply_channel.send({
"text": json.dumps({
'message': 'Welcome'
})
})
def ws_receive(message):
message.reply_channel.send({"accept": True})
print("Backend received message: " + message.content['text'])
Message.objects.create(
message = message.content['text'],
)
@channel_session_user_from_http
def ws_connect(message):
# Accept the connection
message.reply_channel.send({"accept": True})
# Add to the chat group
Group("chat-%s" % message.user.username[0]).add(message.reply_channel)
message.reply_channel.send({
"text": json.dumps({
'message': 'Welcome'
})
})
@channel_session_user
def ws_receive(message):
message.reply_channel.send({"accept": True})
print("Backend received message: " + message.content['text'])
Message.objects.create(
message = message.content['text'],
)
Channel("chat-%s" % message.user.username[0]).send({
"text": json.dumps({
'message': 'Can we start?'
})
})
@channel_session_user
def ws_disconnect(message):
Group("chat-%s" % message.user.username[0]).discard(message.reply_channel)
更新
目前,我尝试以下所示的方式,但我不确定是否正确完成?此外,我想知道是否可以为所有用户使用一个URL?例如,每个客户端都使用localhost:8000,但聊天是分开的,用户只能看到自己的消息和来自后端的响应。他没有其他聊天的机会。此外,我必须确保WebSocket的每个用户id与REST的用户id相同
routes.py:
route("websocket.connect", ws_connect, path=r"^/(?P<room_name>[a-zA-Z0-9_]+)/$"),
route("websocket.receive", ws_receive, path=r"^/(?P<room_name>[a-zA-Z0-9_]+)/$"),
route("websocket.disconnect", ws_disconnect, path=r"^/(?P<room_name>[a-zA-Z0-9_]+)/$"),
您是否已经在
请求
对象中拥有用户的所有详细信息?与REST中的request.user.id
一样,如果您的意思是request
,那么是的。但当用户使用websockets发送消息时,他不会发送消息。我的问题是否意味着如何在Django中获取当前登录用户的用户id?
否,我问的是如何使用websockets和REST对用户进行身份验证。你真的问了吗?:)我认为是这样。我不确定应该使用哪种方式来验证使用WebSocket的用户。因为当我使用REST时,我在头中发送令牌。有了WebSocket,这似乎并不那么容易。但是我对频道没有太多经验。你不是已经在请求
对象中获得了用户的所有详细信息吗?与REST中的request.user.id
一样,如果您的意思是request
,那么是的。但当用户使用websockets发送消息时,他不会发送消息。我的问题是否意味着如何在Django中获取当前登录用户的用户id?
否,我问的是如何使用websockets和REST对用户进行身份验证。你真的问了吗?:)我认为是这样。我不确定应该使用哪种方式来验证使用WebSocket的用户。因为当我使用REST时,我在头中发送令牌。有了WebSocket,这似乎并不那么容易。但我对频道没有太多经验。