Каналы Django: передайте данные формы потребителю - PullRequest
0 голосов
/ 11 марта 2019

Я изучаю Django и работаю на веб-странице, где мне нужно предложить пользователю возможность войти во внешний сервис. Я не могу просто использовать традиционную систему представлений Django, потому что в противном случае я бы потерял связь с простым обновлением. По этой причине я подумал об использовании Django Channels .

Моя проблема сейчас в том, как отправить данные в класс потребителей? Используя consumers.py, указанный в учебнике , я хотел бы отправить данные из отправки формы в функцию connect, а затем установить соединение, если вход во внешнюю службу в порядке. Затем в этом сценарии я мог бы использовать экземпляр client и методы из этих внешних служб.

Итак, вкратце, возможно ли отправить данные формы потребителю? И будет ли это нормально с точки зрения безопасности в случае конфиденциальных данных?

from channels.generic.websocket import AsyncWebsocketConsumer
import json

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):

        ######
        ## login to external service
        ######

        #get login data from form submited when the websockted is initiated
        username = ...
        pass = ...

        self.client = Client(username, password)
        if  client:       
            await self.accept()

    # Receive message from room group
    async def chat_message(self, event):
        message = event['message']

        self.client.send(event['message'])

Обновление:

To clear the explanation: I can't save the user username and pass of the external service, and that I want to offer the user the possibility to use this [sms service](https://clxcommunications.github.io/sdk-xms-python/tutorial.html) with a text field and phone number.

Так что проблема в том, что даже если я создам форму, а также имя пользователя и пароль для входа (в виде) с

client = clx.xms.Client('myserviceplan', 'mytoken')

тогда в следующем запросе я потеряю экземпляр client. Вот почему я подумал о Django Channels. Но я не совсем уверен, что это лучшее решение ...

1 Ответ

0 голосов
/ 13 марта 2019

Как правило, вы можете вызывать метод у потребителя из внешнего кода следующим образом:

from channels.layers import get_channel_layer
channel_layer = get_channel_layer()

await self.channel_layer.send(
            '<channel_name>',
            {
                'type': '<method_name>',
            }
        )

Но, как видите, для этого необходимо указать имя канала, которое вы можете получить толькопосле того, как клиент подключился.Другими словами, вы не должны пытаться вызвать connect, а какой-то другой метод в потребителе.Кроме того, ваш клиент должен сначала подключиться к веб-сокету, прежде чем вы в конечном итоге получите к нему доступ.Я не понимаю ваш вариант использования полностью, но я надеюсь, что это дает вам представление

...