如何正确使用Django和Angular中的websockets发送和接收带有用户ID的消息?
问题描述:
我打算使用websockets创建chatbot。每个用户都可以拥有自己的帐户。我有Django后端和Angular写的前端。目前我遇到了消息对象的问题。要知道我得到这个在后端:如何正确使用Django和Angular中的websockets发送和接收带有用户ID的消息?
django_1 | django.db.utils.IntegrityError: null value in column "user_id" violates not-null constraint
django_1 | DETAIL: Failing row contains (212, {"message":"Hello"}, null).
它看起来我不会从前端发送用户ID。也许我应该发送这样的东西{"message":"Hello", "id":1}
?我想知道我该如何解决它,以及它应该如何正确地完成?
我的Django的消息模型看起来是这样的:
class Message(models.Model):
user = models.ForeignKey('auth.User')
message = models.CharField(max_length=200)
这是我的后端消费者:
@channel_session_user_from_http
def msg_consumer(message):
text = message.content.get('text')
Message.objects.create(
message=text,
)
Group("chat").send({'text': text})
@channel_session_user
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'
})
})
@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").send({
"text": json.dumps({
'message': 'Can we start?'
})
})
@channel_session_user
def ws_disconnect(message):
Group("chat").discard(message.reply_channel)
这是我的角度分量的一部分:
export class HomeComponent {
response: string;
response2: string;
constructor(
private chatService: ChatService,
private router: Router,
private http: Http,
) {
chatService.messages.subscribe(msg => {
this.response = msg.message;
console.log("Response from backend: " + msg.message);
});
}
private message = {
message: 'this is a test message'
}
sendMsg() {
console.log('new message from client to websocket: ', this.message);
this.chatService.messages.next(this.message);
return this.message.message;
}
send(msg) {
this.message.message = msg;
this.sendMsg();
}
login() {
return this.http.get('/data',)
.map(response => response.json())
.subscribe(response2 => this.response2 = response2);
}
}
@Component({
selector: 'key-up3',
template: `
<input #box (keyup.enter)="keyup7.emit(box.value)">
<p>{{value}}</p>
`
})
export class KeyUpComponent_v3 {
@Output() keyup7 = new EventEmitter<string>();
}
UPDATE 目前我解决了它在后端显示如下。
高清ws_receive(消息):
message.reply_channel.send({"accept": True})
print("Backend received message: " + message.content['text'])
data = json.loads(message.content['text'])
Message.objects.create(
user_id=data['user_id'],
message = data['message'],
)
答
错误似乎表明您Message
实例,而不user_id
已创建。 如果在创建新的Message
实例时添加此参数会怎样?
@channel_session_user_from_http
def msg_consumer(message):
text = message.content.get('text')
Message.objects.create(
user=message.user, # <- Here is the user associated
message=text,
)
Group("chat").send({'text': text})
我明白我应该发送这样的'{“消息”:“你好”,“id”:1}'?或者,也许它应该以另一种方式完成? – wahtdbogh
我不知道,我不确定你的错误与你必须发送的频道或json正文有关。但是,您的模型'Message'声明'user'不是'is_null = True'的外键字段。由于默认'is_null = False',你在创建任何'Message'实例时必须提供一个用户实例(或者一个用户pk)。 – Antwane