如何正确使用Django和Angular中的websockets发送和接收带有用户ID的消息?

如何正确使用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}) 
+0

我明白我应该发送这样的'{“消息”:“你好”,“id”:1}'?或者,也许它应该以另一种方式完成? – wahtdbogh

+0

我不知道,我不确定你的错误与你必须发送的频道或json正文有关。但是,您的模型'Message'声明'user'不是'is_null = True'的外键字段。由于默认'is_null = False',你在创建任何'Message'实例时必须提供一个用户实例(或者一个用户pk)。 – Antwane