簡體   English   中英

如何在Django和Angular中使用websockets使用用戶ID發送和接收消息的方式正確完成?

[英]How it should be done properly to send and receive message with user ID using websockets in Django and Angular?

我將使用websockets創建chatbot。 每個用戶可以擁有自己的帳戶。 我有用Angular編寫的Django后端和前端。 目前,我對消息對象有問題。 智慧地說,我在后端得到這個:

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)

這是我的Angular組件的一部分:

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>();
}

更新目前,我已按照以下后端所示的方式解決了它。

def 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})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM