Django channels trigger websocket send in http view

Я новичок в веб-сокетах и каналах, экспериментирую с простым приложением для уведомлений.

notification model

class Note(models.Model):
    profile = models.ForeignKey('users.Profile', on_delete=models.CASCADE, related_name='notes', blank=1, null=1)
    createTime = models.DateTimeField(default=now)
    url = models.CharField(max_length=255, blank=True, null=True)
    type = models.CharField(max_length=50, blank=True, null=True)
    title = models.CharField(max_length=50, blank=True, null=True)
    content = models.CharField(max_length=255, blank=True, null=True)
    read = models.BooleanField(default=False)

    @staticmethod
    def trigger(url, type, title, content, profile):
        try:
            notes = Note.objects.filter(url=url, type=type, title=title, content=content)
            flag = 1
            for note in notes:
                if note in profile.notes.all():
                    flag = 0
            if flag:
                raise Note.DoesNotExist
        except Note.DoesNotExist:
            note = Note(url=url, type=type, title=title, content=content)
            note.save()
            profile.notes.add(note)
            profile.save()
        return note

    @staticmethod
    def dismiss(**kwargs):
        try:
            Note.objects.filter(**kwargs).delete()
        except Note.DoesNotExist:
            pass

Статический метод trigger вызывается в других http представлениях для генерации уведомления после проверки дублирования. Например:

@csrf_exempt 
def articleLikePost(request):
    if request.is_ajax() and request.method == 'POST':
        try:
            article = Article.objects.get(pk=request.POST['article'])
            if article in request.user.likedArticle.all():
                # unlike
                article.like.remove(request.user)
                article.save()
                Note.dismiss(
                    sender=request.user,
                    points=5, 
                    accepter=article.author, 
                    url=str(reverse_lazy('article-detail', kwargs={'pk': article.pk})),
                    type='up',
                    title='Aritcle receives likes',
                    content=f'{request.user.username} liked your article {article.title}', 
                )
                return JsonResponse({'action': 'unlike'}, status=200)
            else:
                # like
                article.like.add(request.user)
                article.save()
                Note.trigger(
                    sender=request.user,
                    points=5, 
                    accepter=article.author, 
                    url=article.detailLink(),
                    type='up',
                    title='Aritcle receives likes',
                    content=f'{request.user.username} liked your article {article.title}', 
                )
                return JsonResponse({'action': 'like'}, status=200)
        except Article.DoesNotExist:
            return JsonResponse({'e': 'Article not found'}, status=400)
    return JsonResponse({}, status=400)

Я построил базовый потребитель и успешно запустил слои Redis:

class NoteConsumer(WebsocketConsumer):
    def connect(self):
        # print(self.scope['user'].profile)
        self.accept()

    def disconnect(self, close_code):
        pass

    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        self.send(text_data=json.dumps({
            'message': message
        }))

это работает следующим образом, когда пользователю нравится ваша статья, вы немедленно получаете заметку на вашем фронтенде. но мне не удалось подключиться trigger к веб-сокету.

другими словами, Notification в основном вызывается http-запросом, но как я могу получить доступ к веб-сокету пользователя в функции http view?


Простите, если вопрос показался вам невежественным. Я буду более чем рад, если вы сможете предложить мне что-нибудь почитать.

Вернуться на верх